.txt
100バイトより長いすべてのファイルの最初の行を印刷したいです。これまでの基準を満たすファイルを収集しましたが、ファイルの最初のテキスト行を印刷する方法がわかりません。
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
オプションは、デフォルトの改行文字の代わりにヌルバイトを引数区切り文字として使用します。