具有长名称的 Linux mv 文件

san*_*zti 20 linux files filesystems mv

在 Linux 中,我有时会像这样重命名文件:

mv dir1/dir2/dir3/file.txt  dir1/dir2/dir3/file.txt.old
Run Code Online (Sandbox Code Playgroud)

请注意,我只想重命名文件,而不是将其移动到另一个目录。

是否有一个命令可以让我执行该命令的速记版本?我在想这样的事情:

mv dir1/dir2/dir3/file.txt  file.txt.old
Run Code Online (Sandbox Code Playgroud)

或者甚至是类似的东西(只是附加到名称):

mv dir1/dir2/dir3/file.txt  {}.old
Run Code Online (Sandbox Code Playgroud)

我的目标是不必再次指定完整路径。

我知道我写的那些“例子”不起作用,但这只是我想要完成的一个想法。

我不想进入目录。

Arc*_*mar 46

对于单个文件尝试

mv dir1/dir2/dir3/file.{txt,txt.old}
Run Code Online (Sandbox Code Playgroud)

X{a,b}构造扩展到的地方Xa Xb,您可以使用预览

echo dir1/dir2/dir3/file.{txt,txt.old}
Run Code Online (Sandbox Code Playgroud)

看看它是否适合您的需要。

笔记:

  1. 对于多个文件

    mv dir1/dir2/dir3/file{1,2,3}.{txt,txt.old}
    
    Run Code Online (Sandbox Code Playgroud)

不太可能扩展到你想要的。(这将扩展为混合的 file.txt file1.txt.old file2.txt ...)

  1. {txt,txt.old}可以{,.old}根据评论缩短为

  2. 如果目录名称明确,则可以使用通配符。

    mv *1/*2/d*/*.{,old}
    
    Run Code Online (Sandbox Code Playgroud)

多文件使用 rename

rename -n s/txt/old.txt/ dir1/dir2/dir3/file*.txt 
Run Code Online (Sandbox Code Playgroud)

删除-n以进行有效的重命名。

  • `mv dir1/dir2/dir3/file.txt{,.old}` 是否也不起作用,甚至更短? (14认同)
  • @Josh 是的,它工作得很好,需要更少的击键。我经常使用这种结构。 (3认同)
  • 有趣的是,您可以使用 Linux shell 多年,并且仍然一直在寻找新技巧 (2认同)

Fab*_*ian 6

该命令rename重命名所有匹配的文件。它的主要目的是重命名多个文件,但是如果 Perl 表达式只匹配一个文件,那么它只会重命名这个单个文件。有关详细信息和发行版特定语法,请阅读联机帮助页:man rename

用法示例:将“/path/file.txt”重命名为“/path/file.txt.old”:

rename 's/file.txt/file.txt.old/g' /path/file.txt

更短的符号(感谢 shalomb):

rename 's/$/.old/' /path/file.txt
rename '$_.=".old"' /path/file.txt
Run Code Online (Sandbox Code Playgroud)

对于试运行使用rename -n

更多示例和详细信息可以在https://thepcspy.com/read/bulk-rename-files-in-ubuntu/找到

  • 不幸的是,不同的 Linux 发行版有不同的 `rename` 命令,它们的行为完全不同。 (6认同)