주문하다:
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
작동 방식:
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
-
xargs
옵션 및 매개변수-0
NUL로 구분된 입력을 예상하도록 xargs에 지시합니다.-r
하나 이상의 파일이 발견되지 않으면 명령을 실행하지 않도록 xargs에 지시합니다. (이 옵션은 BSD 또는 OSX에서는 필요하지 않으며 OSX와 호환되지 않습니다xargs
.)cp -t /path/to/dest
디렉터리를 대상 디렉터리에 복사합니다. (-t
GNU가 필요합니다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 옵션 이해