特定の「検索」基準に一致するすべてのファイルの最初の行をどのように印刷できますか?

特定の「検索」基準に一致するすべてのファイルの最初の行をどのように印刷できますか?

.txt100バイトより長いすべてのファイルの最初の行を印刷したいです。これまでの基準を満たすファイルを収集しましたが、ファイルの最初のテキスト行を印刷する方法がわかりません。

find -size +100c -name "*.txt"

それとも私が完全に間違った道を行っているのでしょうか?

答え1

head -n 1各ファイルに対して実行する必要があります。

find . -size +100c -name '*.txt' -execdir head -n 1 {} \;

またはfindサポートしていない場合-execdir

find . -size +100c -name '*.txt' -exec head -n 1 {} \;

あなたのheadバージョンがそれをサポートする-qか、単一の呼び出しで複数のファイルを処理するときに各ファイルに表示されるヘッダーを気にしない場合は、次のように2つのバリエーションを少し効率的にすることができます。

… -exec head -q -n 1 {} +

(望むより競争条件と-exec利点を理解してください-execdir。 )

答え2

xargs次の出力を処理するための提案が頻繁に表示されます。find

find -size +100c -name "*.txt" | xargs head -n 1

xargsリストを取得するファイル名与えられたコマンドの引数として与えられたファイル名を使って find によって生成されます。 「あまりにも多くの引数」または「長すぎるコマンド」エラーを防ぐために、これをインテリジェントに実行します。

head -q -n1ファイル名が複数与えられたときに追加のヘッダーを提供したくない場合に使用できます。


ファイル名にはほぼすべての文字(改行文字を含む)を含めることができるため、find | xargsを呼び出す方が安全です。

find -size +100c -name "*.txt" -print0 | xargs -0 head -n 1
  • この-print0ディレクティブは、デフォルトの改行文字の代わりにヌルバイトで区切られたファイル名を出力します。
  • xargs-0オプションは、デフォルトの改行文字の代わりにヌルバイトを引数区切り文字として使用します。

関連情報