다음을 사용하여 특정 텍스트 문자열이 포함된 폴더에서 파일을 찾을 수 있습니다.
grep -lir 'string' ~/directory/*
위 결과에 나타나는 파일을 다른 위치로 어떻게 이동할 수 있나요?
답변1
세 번째 구문과 함께 xargs
사용됩니다 .mv
mv [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에 대한 원래 답변입니다.