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

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

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

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

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

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

客观的
输入:/content/somefile_compressed.swf
输出:/content/somefile_content.swf

答案1

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

查找“../content”-name“*_compressed.swf”-exec sh-c'cp {}`dirname {}`/`basename {} compressed.swf`content.swf'\;

还有著名的重命名工具与 Perl 一起发布的脚本,以及改名命令可能会让这一切变得更容易一些。虽然这些命令并非在所有发行版上都可用,但大多数情况下这些命令都可用。

答案2

我确信这一切都可以在一行中完成。我非常接近找到一行解决方案,在一些帮助下甚至更接近,但没有成功。以下方法有效:

#!/bin/bash

# Read all file names into an array
FilesArray=($(find "../content" -name "*_compressed.swf"))

# Get length of an array
FilesIndex=${#FilesArray[@]}


# Use for loop read all directory names
for (( i=0; i<${FilesIndex}; i++ ));
do
    source="${FilesArray[$i]}"
    destination="$(echo "${source}" | sed 's/compressed/content/')"
    cp "${source}" "${destination}"
done

exit 0;

答案3

我相信这应该可以解决问题,如果你真的需要的话,可以将其折叠成一行;)

find ../content -name '*_compressed.swf' | while read file
do
cp "$file" "${file/_compressed.swf/_content.swf}"
done

在这些情况下,Bash 模式替换可以很好地发挥作用。

相关内容