如何使用 sed 来改变 find 的结果并将结果传递给 cp?

如何使用 sed 来改变 find 的结果并将结果传递给 cp?

在 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 章)。

基本上,当您将命令括在反引号之间时,该命令本身将在其输出中被替换。

相关内容