如何使用 find 将所有找到的文件复制到相同目录中的新名称?

Mic*_*ott 5 linux bash cp find xargs

我有一个简单的命令,几乎可以完成我想要的操作。以下将定位所有后缀为“_compressed.swf”的文件,并将每个文件复制到其同一个目录中,并附加“.bak2”:

find '../content' -name '*_compressed.swf' -print0 | xargs -0 -I {} cp {} {}.bak2

结果
输入:/content/somefile_compressed.swf
输出:/content/somefile_compressed.swf.bak2

但是,我需要将 '_compressed.swf' 替换为 '_content.swf' 我想使用 find,而不是 cp 上的递归标志以保持一致性。

目标
输入:/content/somefile_compressed.swf
输出:/content/somefile_content.swf

Joh*_*n T 6

这个解决方案可能是最便携的:

find "../content" -name "*_compressed.swf" -exec sh -c 'cp {} `dirname {}`/`basename {}compressed.swf`content.swf' \;

还有著名的rename.pl脚本,它与 Perl 一起分发,还有rename命令可以使这更容易一些。但是,并非所有发行版都提供这些命令,这些命令在大多数情况下都可用。

  • @Michael 正在发生的事情是文件正在以新名称移动。如果`{}` 包含`/etc/somefile_compressed.swf`,则dirname 采用`/etc`,而`basename {}compressed.swf` 将为您留下`somefile_`。现在你把这两个和我在中间添加的斜杠 (`/`) 放在一起,你就有了 `/etc/somefile_`。您会注意到我在末尾添加了 `content.swf`,因此它完成了作为 `/etc/somefile_content.swf` 的语句。哈。 (2认同)