如何在 Bash Shell 中将字符串附加到文件名?

如何在 Bash Shell 中将字符串附加到文件名?

因此,我应该找到给定目录中所有以 .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

相关内容