grep - 現在grepで検索されているファイルのファイル名を印刷します。

grep - 現在grepで検索されているファイルのファイル名を印刷します。

一致するファイル名を取得するのに問題はありません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でそれに対応するシステムコールトラッカーを使用し、ファイルを開くために使用されるすべてのシステムコールを追跡することです。trussdtrusstuscopen()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

関連情報