it-swarm-ja.com

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;

それは少し多いように思えますが、同じことを達成するために、findコマンドとcpコマンドとインラインでsedを使用する方法を考えています。私は次のようなものを望んでいましたが、どうやら括弧は操作の順序を変更するための許容できる方法ではありません。

find . -name *_compressed -exec cp {} (echo '{}' | sed 's/english/spanish/')
5

より簡単な方法がありますが、移植性のために、少しフォークとバックティックを使用できます。

見つける。 -name * _compressed -exec sh -c'cp {} `echo {} | sed's/english/spanish/'`' \;
7
John T

私はバッククォートを使用します:あなたはそれについてもっと見つけるでしょう ここ (バッククォートは第3.4.5章にあります)。

基本的に、バッククォートでコマンドを囲むと、コマンド自体が出力に置き換えられます。

1
dag729