[unix] 텍스트 문자열이 포함 된 파일을 찾아 이동하는 Grep 명령

이 명령을 사용하여 특정 텍스트 문자열을 포함하는 폴더에서 파일을 찾을 수 있습니다.

grep -lir 'string' ~/directory/*

위 결과에 나타나는 파일을 다른 위치로 옮기려면 어떻게합니까?



답변

항상 그렇듯이주의하십시오 grep -r. -r는 표준 옵션이 아니며 최신 버전의 GNU와 같은 일부 구현 grep에서는 디렉토리 트리를 내릴 때 기호 링크를 따릅니다. 일반적으로 원하는 것이 아니며 예를 들어 “/ 디렉토리 트리 어딘가에

유닉스 철학에서는 명령을 사용하여 디렉토리를 검색하여 파일을 찾고 다른 디렉토리를 찾아 내용을 봅니다.

GNU 도구를 사용하여 다음을 수행합니다.

xargs -r0 --arg-file <(find . -type f -exec grep -lZi string {} +
  ) mv -i --target-directory /dest/dir

그러나 다른 사용자가 쓸 수있는 디렉토리에서 한 사용자로 실행하는 경우 경쟁 조건 및 가능한 보안 문제에주의하십시오.


답변

의 세 번째 구문 xargs과 함께 사용하십시오 mv.mv [OPTION]... -t DIRECTORY SOURCE...

grep -lir 'string' ~/directory/* | xargs mv -t DEST

특수 문자 (공백, 따옴표)가 포함 된 파일에주의하십시오. 이 경우 sed(파일 이름 주위에 따옴표 추가)로 목록을 필터링하면 s/^/'/;s/$/'/도움이 될 수 있지만 반드시 따옴표는 파일 이름에 나타나지 않습니다. GNU grep에는 파일 이름을 NUL로 종료 하는 -Z/ --null옵션이 있습니다.

세 번째 구문의 대안 은 자리 표시 자 문자열 ( ) 과 함께 mv사용 xargs하는 것 -I입니다.

또 다른 옵션은 ire_and_curses의 답변에 언급 된 명령 대체 $( )또는 백틱 ``(bash)입니다.


답변

파일 이름에 특수 문자 (공백 또는 \[*?)가 포함되어 있지 않으면 명령 대체를 사용하십시오 .

mv `grep -lir 'string' ~/directory/*` destination/


답변

POSIX 지정 기능 만 사용 하고 파일 이름에 대한 가정은 없습니다 .

find ~/directory -type f -exec grep -qiF 'string' {} \; -exec mv {} /path/to/dest \;

노트:

“패턴”이 아니라 “문자열”이라고 말 했으므로 -F(고정 문자열 검색) 옵션이 grep적절 해 보입니다.

대상 디렉토리가 검색 디렉토리 안에 있으면 불쾌한 경쟁 조건이있을 수 있습니다.

POSIX 사양 grep

POSIX 사양 find


답변

GNU 병렬 사용 :

grep -i -Z -r -l 'string' . | parallel 'mv {} destination/{}'

ht / @ lin-dong은 xargs로 자신의 원래 답변을 받았습니다.


답변

대상 디렉토리가 ‘외부’이고 모든 XLS 파일을 이동해야한다고 가정하면 아래 명령을 시도 할 수 있습니다

sudo mv find /var/log/ -type f -name "*.xls"/ 외부 /


답변