次の要件を満たすために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で終了します。
awk
find
スクリプトが終了ステータス0で終了すると、コマンドはcat
ファイルを呼び出してその内容を標準出力に出力します。
find
にリダイレクトすると、/tmp/file.txt
最終出力用のすべてのファイルがにcat
移動されます/tmp/file.txt
。find
コマンドの実行が開始される前に、ファイルはシェルによって切り捨てられます(空になります)。
コマンドが無限ループに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
ファイルが存在しない場合は、新しいファイルを作成するか、既存のファイルを消去します。