파일의 단어를 파악한 다음 파일을 복사하세요.

파일의 단어를 파악한 다음 파일을 복사하세요.

파일 모음(*.zip, *.txt, *.tar.gz, *.doc, ... 등)이 있습니다. 이러한 파일은 경로에 있습니다. 모든 파일(*.txt)을 찾은 다음 특정 단어(예: LINUX/UNIX)가 포함된 텍스트 파일만 복사하고 싶습니다.

다음 명령을 실행했습니다.

find . -name "*.txt" | grep 'LINUX/UNIX'

이 명령은 모든 텍스트 파일을 찾은 다음 "grep"을 사용하여 "LINUX/UNIX"가 포함된 파일만 나열하여 결과 텍스트 파일을 필터링합니다.

이러한 최종 파일(예: "LINUX/UNIX"가 포함된 텍스트 파일)을 선택한 특정 경로에 복사하려면 어떻게 해야 합니까?

신청해 봅니다xargs

find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>

하지만 성공은 없어

답변1

노력하다:

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

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

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

grep -rl --null --include '*.txt' LINUX/UNIX . | 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에 지시합니다. ( --null지원자 :grepGNU/리눅스,애플 시스템그리고FreeBSD하지만아니요 오픈BSD.)

    • 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.)

답변2

이식성 향상(POSIX 기능만 해당):

find . -type f -name '*.txt' -exec grep -q LINUX/UNIX {} \; -exec cp {} /path/to/dest \;

답변3

다음 sh/Bash oneliner는 또 다른 접근 방식이지만 현재 디렉터리에서만 작동하고 반복되지 않습니다.

for f in ./*.txt; do if grep -l 'LINUX/UNIX' "$f"; then cp "$f" /path/to/dest/; fi; done

grep 옵션은 -l복사되는 파일 목록을 인쇄하지만 -q화면에 아무것도 표시하지 않으려면 이 옵션을 사용할 수 있습니다.

답변4

왜 원시 문자열이 작동하지 않는지 잘 모르겠습니다. 다음 명령이 나에게 효과적이었습니다.

/ -name(파일 이름*) | grep '(filename.extension)' | xargs cp -t ./

내 경우 filename*은 이름은 같지만 파일 형식(txt, zip 등)이 다른 파일 모음입니다. grep을 통해 filename.txt만 찾아 대상 디렉터리(현재 ./)에 복사합니다.

관련 정보