因此,我应该找到给定目录中所有以 .C 或 cc 为后缀的文件,然后将其名称更改为 .C.blah 或 .cc.blah
有命令可以做到这一点吗?
或者我应该用命令 find 来实现这个吗?
答案1
有几种方法,取决于您的 *nix 上有哪些可用功能。
有两个不同的rename
命令,一个通过 perl 提供,一个作为标准实用程序的一部分。
Perl 版本:
rename 's/(\.cc$|\.C$)/$1.blah/' *.cc *.C
utils 版本 - 你可以用一行来做到这一点:
rename .C .C.blah *.C
rename .cc .cc.blah *.cc
for 循环:
for i in *.C *.cc ; do mv $i $i.blah ; done
答案2
使用一个简单的 for 循环:
for file in *.txt; do echo $file $file.blah; done
此命令将旧文件名和新文件回显到终端。如果您获得了预期的结果,请使用真正的命令:
for file in *.txt; do mv $file $file.blah; done
无论如何,这不会重命名子目录中的 *.txt 文件。请使用 find 进行重命名。
答案3
我知道你已经找到了自己可以接受的解决方案,但我想发布我在工作中通常会使用的方法。此语法适用于 GNU findutils,它是任何现代 Linux 发行版的一部分。
## xargs is much faster than -exec, xargs can run parallel on # cores with -P #
find ./ -type f -name '*.C' -o -name '*.cc' | xargs -I '{}' mv '{}' '{}'.BAK
## If I'm specifying more than two extensions, I would generally use a regex
find ./ -type f -regex ".*\.\(C\|cpp\)$" | xargs -I '{}' mv '{}' '{}'.BAK
尤其是现在常见的四核 SMP 服务器,通常可以使用 来将运行时间减半-p 4
。即使只有一个核心,也可以避免引发xargs
无关的分叉find ...-exec
。有了桌面和无限时间,这实际上不是问题。另一方面,使用服务器资源并处理数千个文件,避免不必要的开销是当务之急。
答案4
有两个不同的rename
命令。
在 Ubuntu/Debian/... 发行版上:
rename -v 's/$/.blah/' *.C *.cc
在 RedHat/CentOS/... 发行版上:
rename -v $ .blah *.C *.cc