検索結果のファイルに対してコマンドを実行する

検索結果のファイルに対してコマンドを実行する

階層内で同じ名前(myfile)を持つ複数のファイルをいくつか変更したいと思います。デフォルトでは、ファイルの最初の行を「my new line」に置き換えて、2行目を削除したいと思います。私はこれを試みます:

find . -name myfile -exec cat {} \; | sed -i -e '1 c my new line' -e '2d'

myfile がコマンドを実行するディレクトリにある場合、階層の低レベルでは機能しますが、上位レベルでは機能しません。

次のエラーメッセージがあります。

sed: no input files
find: ‘cat’ terminated by signal 13

どうすればいいですか? (私はUnixコマンドについてはよくわかりません。)ポイントは、catの出力をsedにリダイレクトし、見つかった同じファイルを変更することです。

答え1

このcatコマンドをスキップすると問題が解決する可能性があります。

find . -name myfile -exec sed -i -e '1 c my new line' -e '2d' {} \;

exec の引数は{}ファイル名なので、sed -i各ファイルに対してコマンドを実行します。

答え2

find 最初に呼び出さずにsedを使用して行を変更できます。

sed -i '1c my new line' **/myfile

shopt -s globstar最初にglobstar()を設定する必要があるかもしれませんが、

関連情報