回答:
他の答えとそのコメントに基づいて、
find . -type f -exec awk '/^!<symlink>/ {print FILENAME} {nextfile}' {} +
を使用するため-exec … +
、awk
(引数リストの最大サイズに基づいて)可能な限り数回実行されます。場合はawk
、正規表現(すなわち、検索文字列)に一致する行を見つけ、それはファイル名を表示します。(\
文字列を一重引用符で囲む場合、バックスラッシュ()は必要ありません。)もちろん、行の内容も表示したい場合は、言うことができます
{print FILENAME; print}
または
{print FILENAME ": " $0}
そして、無条件に、次のファイルに進みます。したがって、各ファイルの最初の行のみを効率的に調べます。注:POSIXではnextfile
定義されていないようです。それはおそらくGNUでのみです。awk
nextfile
はPOSIXではありませんが、いくつかのawk
実装にあり、標準の次のバージョンに含める予定です。
-size +9c
どうですか:
find . -type f -exec head -1v {} + | egrep -B 2 -nw -e "^\!<symlink>"
-type f
少なくとも必要になるでしょう。残念ながら、ファイルごとに新しいプロセスが作成されるため、これは非常に非効率的です。
grep -B2
がそれを処理します(ファイル名を含まない行を削除するためにさらに後処理できます)。
-exec … {} +
他のアイデアにも基づいています。
考えたことがありxargs
ますか?いくつかの並列化を行うことができます。
find . -type f -print0 | xargs -0 -P4 head -1 | egrep -wn "^\!<symlink>"
機能:通常のファイルをすべて検索し、ファイルのリストを空白ではなく「\ 0」で区切ります。
'\ 0'がセパレーターであることを理解し、4つの同時プロセスを実行するようにxargsに指示します(コア数とディスク速度に合わせて調整します)。Xargsは各ファイルでheadコマンドを実行します。
最後に、パターンで結果を把握します。
頭はまだ十分に実行されます。しかし同時に!この種の定期的な検索を行う必要がない限り、それをさらに最適化しようとはしません。とにかく一度だけ実行した場合、より高速なランタイムでは、より多くの最適化にかかる時間は得られません。
-B1
仕様を追加することで、それらを別々の行で取得できますegrep
—しかし、それでも、安全にするために追加-v
する必要head
があります。に渡す-n
ことegrep
は、私が見ることができる目的を果たしません。