指定された文字列で始まるすべてのファイルをすばやく見つける


2

壊れたCygwinシンボリックリンクを見つけるためのコマンドを書いています。

今、私は使用しています:

egrep -rnw . -e "^\!<symlink>"

しかし、これはあまり効率的ではありません。ファイルがで始まる場合、私は気にし!<symlink>ますが、grepファイルの残りの部分を探し続けます。

コンテンツプレフィックスでファイルを効率的に検索する方法はありますか?


回答:


3

他の答えとそのコメントに基づいて、

find . -type f -exec awk '/^!<symlink>/ {print FILENAME} {nextfile}' {} +

を使用するため-exec … +awk(引数リストの最大サイズに基づいて)可能な限り数回実行されます。場合はawk、正規表現(すなわち、検索文字列)に一致する行を見つけ、それはファイル名を表示します。(\文字列を一重引用符で囲む場合、バックスラッシュ()は必要ありません。)もちろん、行の内容も表示したい場合は、言うことができます

{print FILENAME; print}

または

{print FILENAME ": " $0}

そして、無条件に、次のファイルに進みます。したがって、各ファイルの最初の行のみを効率的に調べます。注:POSIXではnextfile定義されていないようです。それはおそらくGNUでのみです。awk




あなたが追加することによって、それを最適化できることに注意してください-size +9c
ステファンChazelas

2

どうですか:

find . -type f -exec head -1v {} + | egrep -B 2 -nw -e "^\!<symlink>"

1
まず最初に、-type f少なくとも必要になるでしょう。残念ながら、ファイルごとに新しいプロセスが作成されるため、これは非常に非効率的です。
PythonNut

1
また、文字列が見つかったファイルの名前も報告しません。
StéphaneChazelas 15

@StéphaneChazelas grep -B2がそれを処理します(ファイル名を含まない行を削除するためにさらに後処理できます)。
ジル

@PythonNutこの非効率性を容易に切り替えることにより解決される-exec … {} +
ジル

0

他のアイデアにも基づいています。

考えたことがありxargsますか?いくつかの並列化を行うことができます。

find . -type f -print0 | xargs -0 -P4 head -1 | egrep -wn "^\!<symlink>"

機能:通常のファイルをすべて検索し、ファイルのリストを空白ではなく「\ 0」で区切ります。
'\ 0'がセパレーターであることを理解し、4つの同時プロセスを実行するようにxargsに指示します(コア数とディスク速度に合わせて調整します)。Xargsは各ファイルでheadコマンドを実行します。
最後に、パターンで結果を把握します。

頭はまだ十分に実行されます。しかし同時に!この種の定期的な検索を行う必要がない限り、それをさらに最適化しようとはしません。とにかく一度だけ実行した場合、より高速なランタイムでは、より多くの最適化にかかる時間は得られません。


1
これにより、パターンに一致する最初の行がすべて表示されますが、ファイルの名前は表示されません。-B1仕様を追加することで、それらを別々の行で取得できますegrep—しかし、それでも、安全にするために追加-vする必要headがあります。に渡す-nことegrepは、私が見ることができる目的を果たしません。
Gマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.