일치하는 파일 이름을 얻는 데 문제가 없습니다 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
버전을 다시 확인하는 것이 좋습니다.
파일당 하나씩 실행 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