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 fFreeBSD에는 없습니다). 자체적으로 일반 파일에 대한 심볼릭 링크를 확인하는지 여부는 구현 및 버전 grep -r에 따라 다르므로 grep버전을 다시 확인하는 것이 좋습니다.

파일당 하나씩 실행 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

관련 정보