在 solaris 中,我想将 find 命令找到的所有文件复制到略有不同的路径。以下脚本基本上对 find 找到的每个文件执行 cp。例如:
cp ./content/english/activity1_compressed.swf ./content/spanish/activity1_compressed.swf
cp ./content/english/activity2_compressed.swf ./content/spanish/activity2_compressed.swf
...
#!/bin/bash
# Read all file names into an array
FilesArray=($(find "." -name "*_compressed.swf"))
# Get length of an array
FilesIndex=${#FilesArray[@]}
# Copy each file from english to spanish folder
# Ex: cp ./english/activity_compressed.swf ./spanish/activity_compressed.swf
for (( i=0; i<${FilesIndex}; i++ ));
do
source="${FilesArray[$i]}"
# Replace "english" with "spanish" in path
destination="$(echo "${source}" | sed 's/english/spanish/')"
cp "${source}" "${destination}"
done
exit 0;
这似乎有点多,我想知道如何将 sed 与 find 和 cp 命令一起使用来实现相同的目的。我本来希望得到类似下面的结果,但显然括号不是改变操作顺序的可接受方法:
find . -name *_compressed -exec cp {} (echo '{}' | sed 's/english/spanish/')
答案1
有更简单的方法,但是为了便于移植,我们可以使用一些分叉和反引号:
查找 . -name *_compressed -exec sh -c 'cp {} `echo {} | sed 's/english/spanish/'`' \;
答案2
我会使用反引号:你会发现更多这里(反引号在第 3.4.5 章)。
基本上,当您将命令括在反引号之间时,该命令本身将在其输出中被替换。