Grep 명령은 텍스트 문자열이 포함된 파일을 찾아 이동합니다.

Grep 명령은 텍스트 문자열이 포함된 파일을 찾아 이동합니다.

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

grep -lir 'string' ~/directory/*

위 결과에 나타나는 파일을 다른 위치로 어떻게 이동할 수 있나요?

답변1

세 번째 구문과 함께 xargs사용됩니다 .mvmv [OPTION]... -t DIRECTORY SOURCE...

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

특수 문자(공백, 따옴표)가 포함된 파일에 주의하세요. 이 경우 필터링된 목록을 사용하면 sed(파일 이름 주위에 따옴표 추가 s/^/'/;s/$/'/) 도움이 될 수 있지만 이러한 따옴표가 파일 이름에 나타나지 않도록 해야 합니다. GNU에는 NUL로 끝나는 파일 이름에 대한 / 옵션이 grep있습니다 .-Z--null

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

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

답변2

언제나 그렇듯이 조심하세요 grep -r. -r표준 옵션이 아니며 최신 버전의 GNU를 제외한 일부 구현에서는 grep디렉토리 트리를 내려갈 때 일반적으로 원하는 것이 아닌 심볼릭 링크를 따릅니다. 디렉토리 트리 어딘가에 심각한 결과를 초래할 수 있습니다."

Unix 철학에서는 한 명령을 사용하여 디렉터리에서 파일을 검색하고 다른 명령을 사용하여 해당 내용을 봅니다.

GNU 도구를 사용하면 다음과 같이 할 수 있습니다.

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

그러나 그럼에도 불구하고 다른 사용자가 쓸 수 있는 디렉터리에서 한 명의 사용자로 실행하는 경우 경쟁 조건과 발생할 수 있는 보안 문제에 유의하세요.

답변3

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

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

답변4

사용GNU 병렬:

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

ht/ @lin-dong의 xargs에 대한 원래 답변입니다.

관련 정보