JOHN1024의 XARGS 솔루션

JOHN1024의 XARGS 솔루션

주문하다:

grep -rl "KORD" ./

디렉토리를 검색하고 파일 내용(제목 아님)에 "KORD"가 포함된 파일 목록을 반환합니다.

Users-MacBook-Air:myPhotorec user$ grep -rl "KORD" ./
.//output_apikey.txt
.//recup_dir.17/f13470392.txt
.//recup_dir.49/f45361992.txt
.//recup_dir.49/f45362424.txt
.//recup_dir.53/f48768408.txt
.//recup_dir.53/f49295480.txt

출력 파일 목록을 콘솔에 인쇄하고 각 파일을 디렉토리( ./ORD )에 복사하도록 grep 명령을 향상시키는 기본 명령(xargs?)이 있습니까?

나는 "고양이 가죽을 벗기는" 방법이 여러 가지가 있다고 생각합니다. 한 가지 이상의 해결책이 있기를 기대합니다.

JOHN1024의 XARGS 솔루션

중복된 태그로 인해 수정된 게시물이 답변으로 게시되지 않습니다.

노력하다:

grep -rl --null --include '*.txt' KORD . | xargs -0r cp -t /path/to/dest

이 명령은 NUL 구분을 사용하므로 공백, 탭 또는 개행 문자가 포함된 복잡한 이름을 포함한 모든 파일 이름에 안전합니다.

위의 작업에는 GNU가 필요합니다 cp. BSD/OSX의 경우 다음을 시도해 보세요.

grep -rl --null --include '*.txt' KORD . | xargs -0 sh -c 'cp "$@" /path/to/dest' sh

작동 방식:

  1. grep옵션 및 매개변수

    • -r디렉토리 구조에서 재귀적으로 검색하도록 grep에 지시합니다. (FreeBSD에서는 -r디렉토리에 대한 심볼릭 링크가 따라갑니다. OS/X나 최신 버전의 GNU에서는 그렇지 않습니다 grep.)

    • --include '*.txt'이름이 glob과 일치하는 파일( 또는 *.txt같은 숨겨진 파일 포함 ) 만 반환하도록 grep에 지시합니다 ..foo.txt.txt

    • -l일치하는 파일 자체가 아닌 일치하는 파일의 이름만 반환하도록 grep에 지시합니다.

    • --null파일 이름을 구분하기 위해 NUL 문자를 사용하도록 grep에 지시합니다.

    • LINUX/UNIX내용에 정규식이 포함된 파일만 찾도록 grep에 지시LINUX/UNIX

    • .현재 디렉토리에서 검색합니다. 최신 버전의 GNU에서는 이를 생략할 수 있지만 로 끝나는 것을 방지 하려면 옵션 종결자를 grep전달해야 합니다 .--cp-

  2. xargs옵션 및 매개변수

    • -0NUL로 구분된 입력을 예상하도록 xargs에 지시합니다.

    • -r하나 이상의 파일이 발견되지 않으면 명령을 실행하지 않도록 xargs에 지시합니다. (이 옵션은 BSD 또는 OSX에서는 필요하지 않으며 OSX와 호환되지 않습니다 xargs.)

    • cp -t /path/to/dest디렉터리를 대상 디렉터리에 복사합니다. ( -tGNU가 필요합니다 cp.)

답변1

find . -type f -exec grep -q 'KORD' {} ';' -exec cp {} ./ORD ';'

현재 디렉토리 안이나 아래의 모든 일반 파일을 찾습니다. grep -q 'KORD'각 파일에서 실행되며 일치하는 줄이 포함된 파일이 디렉터리에 복사됩니다 ./ORD.

GNU coreutils가 설치되어 있으면 약간 더 효율적으로 사용할 수 있습니다.

find . -type f -exec grep -q 'KORD' {} ';' -exec cp -t ./ORD {} +

또한보십시오:"find"의 -exec 옵션 이해

관련 정보