Pipeline Sedは、Find "-exec"から呼び出されたときにBashコマンドの置き換えで見つかったファイル名では機能しません。

Pipeline Sedは、Find

場合によっては、「find」、「bash」、「sed」が期待どおりに機能しないようです。

次の例では、まず「sample.txt」ファイルを生成し、ファイルを見つけて最後に「-exec」コマンドで処理する必要があります。実行されたコマンドは、見つかったファイル名、テストサンプル、および変更されたファイル名を印刷します。 「sed」コマンド自体は、「txt」を「TXT」に置き換えるために使用されます。

touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo {} $(echo Specimen_before.txt {} Specimen_after.txt |sed -e "s/txt/TXT/g") \;

予想される出力は次のとおりです。

./sample.txt サンプル_以前.TXT ./sample.TXT サンプル_以降.TXT

代わりに、次を生成します。

./sample.txt サンプル_以前.TXT ./sample.txt サンプル_以降.TXT

(この例は、バックティック「`」を使用した古いコマンド置換を使用してテストされており、結果は同じでした。)

私は何が間違っていましたか?

ベストアンサー1

コマンドの置き換えは開始前に行われますfind。実行される実際のコマンド(引用符の置換、拡張、および削除後)は次のとおりです。

find ./ -maxdepth 1 -name *.txt -exec echo {} Specimen_before.TXT {} Specimen_after.TXT ;

実行する必要がある場合何もないクール(パイピングまたは複数-execのコマンド)その後、別のシェルを起動してこれを行います。

find . -maxdepth 1 -type f -name '*.txt' \
    -exec sh -c 'printf "%s " "$1"; printf "%s %s %s\n" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh {} ';'

おすすめ記事