一致するファイル名を取得するのに問題はありませんgrep
。ただし、検索中のファイル階層の項目を検索するのに時間がかかるため(コンピュータの2000ファイルに1.4GBのデータ)、SSDがあるため、それほど時間がかかりません。私はそれが何であるか知りたいです。だから私は何かをしたいです。言葉が多いファイルの処理中に grep が各ファイルを一覧表示する出力です。
これはどのように達成できますか?
MacでBSD grepを使用してください。
答え1
grep
検索を開始する前に、別のプロセスを呼び出してファイル名を印刷する必要があります。もちろん、速度は遅くなるでしょうが、あなたの場合はgrep
ブートロード時間が短いので、現在の状況に比べて大きな問題はありません。
検索と実行を使用します。
find . -type f -exec sh -c 'printf "checking: %s\n" "$1"; grep pattern "$1"' sh {} \;
または、一括検索して実行してループ用のシェルを呼び出します。
find . -type f -exec sh -c 'for f do printf "checking: %s\n" "$f"; grep pattern "$f"; done' sh {} +
または、GNU 0で区切られたファイル引数でfindとxargsを使用します。
find . -type f -print0 | xargs -0 sh -c 'for f do printf "checking: %s\n" "$f"; grep pattern "$f"; done'
ところで、macOSを使用していることが確認されます。 grep、sed、awkなどのGNUソフトウェアのインストールを検討してください。
答え2
zsh
(私が理解しているのはmacOSのデフォルトの対話型シェルです)を使用して、次のことができます。
for f (**/*(ND-.)) (set -x; grep pattern $f)
(set -x
省略形は、set -o xtrace
すべてのPOSIXシェルと同様にstderrで実行されたコマンドを印刷し、**/*(ND-.)
シンボリックリンクの確認後に隠しファイルを含むすべての一般ファイルを繰り返し検索します。)
GNUまたはFreeBSD xargs
(そしてmacOSも可能)を使用すると、次のことができます。
find . -type f -print0 | xargs -0tn1 grep pattern
(ここでこの-t
オプションはと同じですxtrace
)
ただし、これは通常のファイルへのシンボリックリンクを考慮しません(GNUにはこの機能はfind
あります-xtype f
がFreeBSDにはありません)。独自の一般的なファイルへのシンボリックリンクをチェックするかどうかは実装とバージョンgrep -r
によって異なりますので、grep
バージョンを再確認することをお勧めします。
ファイルごとに1つずつ実行されるgrep
のでgrep -r
。
別の方法は、//strace
またはmacOSでそれに対応するシステムコールトラッカーを使用し、ファイルを開くために使用されるすべてのシステムコールを追跡することです。truss
dtruss
tusc
open()
openat()
grep
GNU/Linuxでは:
strace -e open,openat grep -r pattern .
macOSでこれに対応するものが何であるかわかりません。
答え3
lsof
これは、すでに実行されているファイルでも特定の時点で実行できますが、grep
ファイルはまだ印刷されません。
まず、実行中のプロセスのPIDを取得しますgrep
。
$ pgrep -l grep
21531 grep
次に、そのプロセスに対して開いているすべてのファイルを一覧表示します。
$ lsof -p 21531
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
grep 21531 izkata cwd DIR 253,1 4096 22020097 /var
grep 21531 izkata rtd DIR 253,1 4096 2 /
grep 21531 izkata txt REG 253,1 219456 22544390 /bin/grep
grep 21531 izkata mem REG 253,1 3004224 11805539 /usr/lib/locale/locale-archive
grep 21531 izkata mem REG 253,1 144976 29104688 /lib/x86_64-linux-gnu/libpthread-2.27.so
grep 21531 izkata mem REG 253,1 2030544 29104673 /lib/x86_64-linux-gnu/libc-2.27.so
grep 21531 izkata mem REG 253,1 14560 29104676 /lib/x86_64-linux-gnu/libdl-2.27.so
grep 21531 izkata mem REG 253,1 464824 29103098 /lib/x86_64-linux-gnu/libpcre.so.3.13.3
grep 21531 izkata mem REG 253,1 170960 29104669 /lib/x86_64-linux-gnu/ld-2.27.so
grep 21531 izkata mem REG 253,1 26376 12064533 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
grep 21531 izkata 0u CHR 136,8 0t0 11 /dev/pts/8
grep 21531 izkata 1u CHR 136,8 0t0 11 /dev/pts/8
grep 21531 izkata 2u CHR 136,8 0t0 11 /dev/pts/8
grep 21531 izkata 3r DIR 253,1 4096 22020408 /var/lib
grep 21531 izkata 4r REG 253,1 35765 22156714 /var/lib/dpkg/info/systemd.md5sums
grep 21531 izkata 5r DIR 253,1 4096 22020692 /var/lib/dpkg
grep 21531 izkata 6r DIR 253,1 471040 22021003 /var/lib/dpkg/info
これらのほとんどは実行する必要がありますが、最後の4行は現在読んでいるgrep
ディレクトリとファイルです(この場合)。grep
/var/lib/dpkg/info/systemd.md5sums