我有一个简单的命令,它几乎可以完成我想要的工作。下面的命令将找到所有带有“_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
答案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 模式替换可以很好地发挥作用。