GNU/Linux >> Linux の 問題 >  >> Linux

パイプライン化されたSedは、Find“ -exec”から呼び出されたときに、Bashコマンド置換内の見つかったファイル名で機能しませんか?

この質問にはすでに回答があります :if command in find -exec

(2つの回答)
11か月前に閉鎖されました。

「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 Specimen_before.TXT ./sample.TXT Specimen_after.TXT

代わりに、以下を生成します:

./sample.txt Specimen_before.TXT ./sample.txt Specimen_after.TXT

(この例は、同じ結果のバッククォート「`」による旧式のコマンド置換でもテストされています)

何が間違っているのですか?

承認された回答:

コマンド置換は、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 %sn" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh {} ';'

Linux
  1. Bashでコマンドが見つかりません修正されました

  2. 一部のコマンドでBashプロセス置換が機能しないのはなぜですか?

  3. `source`の後にコマンド名を入力するとオートコンプリートが機能しないのはなぜですか?

  1. コマンドはZshで見つかりませんが、Bashで見つかりましたか?

  2. 検索:コマンドが見つかりません

  3. find -exec mv {} ./target/ + が機能しないのはなぜですか?

  1. Bash スクリプトは、空の行に Command Not Found を出力します

  2. bash - make コマンドが見つかりません

  3. パターン マッチが bash スクリプトで機能しない