在 Linux 中我有时会像这样重命名文件:
mv dir1/dir2/dir3/file.txt dir1/dir2/dir3/file.txt.old
请注意,我只是想重命名该文件,而不是将其移动到另一个目录。
是否有命令可以让我执行该命令的简写版本?我正在考虑类似的事情:
mv dir1/dir2/dir3/file.txt file.txt.old
或者甚至类似于(仅附加到名称):
mv dir1/dir2/dir3/file.txt {}.old
我的目标是不必再次指定完整路径。
我知道我写的那些“例子”不起作用,但这只是我想要实现的一个想法。
我不想必须通过 cd 进入该目录。
答案1
对于单个文件尝试
mv dir1/dir2/dir3/file.{txt,txt.old}
X{a,b}
构造扩展到的位置Xa Xb
,您可以使用进行预览
echo dir1/dir2/dir3/file.{txt,txt.old}
看看它是否符合您的需要。
笔记:
对于多个文件
mv dir1/dir2/dir3/file{1,2,3}.{txt,txt.old}
不太可能扩展为您想要的内容。(这将扩展为 file.txt file1.txt.old file2.txt 的混合...)
{txt,txt.old}
可以缩短为{,.old}
根据评论如果目录名称明确,则可以使用通配符。
mv *1/*2/d*/*.{,old}
用于多个文件使用rename
rename -n s/txt/old.txt/ dir1/dir2/dir3/file*.txt
删除-n
即可有效重命名。
答案2
该命令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
若要进行试运行,请使用rename -n
。
更多示例和详细信息请访问https://thepcspy.com/read/bulk-rename-files-in-ubuntu/
答案3
对于一次性案例,如果我不想更改当前目录,我可能只使用子 shell:
(cd dir1/dir2/dir3/ && mv file.txt file.txt.old)
因为你cd
在子 shell 中,所以你没有改变实际 shell 中的目录
答案4
如果您想进入子目录以缩短mv
命令,但之后又想返回当前目录,有两种方法可以实现。一种是将cd
andmv
放在子 shell 中(正如已经建议的那样)。
另一种是使用pushd
和popd
更改目录:
pushd dir1/dir2/dir3/; mv file.txt file.txt.old; popd
该pushd
命令类似于cd
,不同之处在于它首先将当前目录的名称推送到堆栈上。popd
从堆栈中删除顶部名称并更改到该目录。