文字列を含むファイルを見つけて、そのファイルの内容全体を新しいファイルに追加します。

文字列を含むファイルを見つけて、そのファイルの内容全体を新しいファイルに追加します。

次の要件を満たすためにbashシェルスクリプトを書くのに役立つ人はいますか? 「file.txt」という新しいファイルを作成し、「Format」で始まる最初の行を含むファイルを検索し、そのファイルの内容全体を新しいファイル「file.txt」に入れます。新しいファイルに追加の結果を生成するには、現在のディレクトリ内のすべてのファイルに対してこれを行う必要があります。

答え1

find . -maxdepth 1 -type f \
        -exec awk 'NR == 1 && /^Format/ { exit 0 } { exit 1 }' {} \; \
        -exec cat {} \; > /tmp/file.txt

これにより、現在のディレクトリですべての一般的なファイルが検索され、各ファイルawkに対して順番にスクリプトが実行されます。-maxdepth 1再帰検索のパラメータが削除されました。

awk現在のファイルの最初の行の先頭に「Format」という単語が含まれている場合、スクリプトは終了ステータス0で終了します。それ以外の場合は、終了ステータス1で終了します。

awkfindスクリプトが終了ステータス0で終了すると、コマンドはcatファイルを呼び出してその内容を標準出力に出力します。

findにリダイレクトすると、/tmp/file.txt最終出力用のすべてのファイルがにcat移動されます/tmp/file.txtfindコマンドの実行が開始される前に、ファイルはシェルによって切り捨てられます(空になります)。

コマンドが無限ループにfile.txt入る可能性があるため、現在ディレクトリにファイルを作成したくありません。find


ここで使用されるパラメータはfind次のとおりです。テスト発見に関することfind。テストが成功すると、次のテストが実行されます。 1つのテストが失敗した場合は、引き続きfind別のテストを探してください。

  • -maxdepth 1入力すると、ディレクトリ深さ1を超えるディレクトリが見つかるとfindテストは失敗します。findしたがって、最上位のディレクトリレベルにのみ保持されます。

  • -type f非正規ファイル(ディレクトリ、ソケット、デバイスファイルなど)の場合、この操作は失敗します。

  • -exec実行されたコマンドがゼロ以外の終了状態を返すと、テストは失敗します。

答え2

ループgrep結果:

truncate -s 0 file.txt

for match in $(grep -lr "$STRING" --exclude file.txt .); do
    cat "$match" >> file.txt
done

truncateファイルが存在しない場合は、新しいファイルを作成するか、既存のファイルを消去します。

関連情報