파일 모음(*.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
작동 방식:
grep
옵션 및 매개변수-r
디렉토리 구조에서 재귀적으로 검색하도록 grep에 지시합니다. (FreeBSD에서는-r
디렉토리에 대한 심볼릭 링크가 따라갑니다. OS/X나 최신 버전의 GNU에서는 그렇지 않습니다grep
.)--include '*.txt'
이름이 glob과 일치하는 파일( 또는*.txt
같은 숨겨진 파일 포함 ) 만 반환하도록 grep에 지시합니다 ..foo.txt
.txt
-l
일치하는 파일 자체가 아닌 일치하는 파일의 이름만 반환하도록 grep에 지시합니다.--null
파일 이름을 구분하기 위해 NUL 문자를 사용하도록 grep에 지시합니다. (--null
지원자 :grep
GNU/리눅스,애플 시스템그리고FreeBSD하지만아니요 오픈BSD.)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
.)
답변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만 찾아 대상 디렉터리(현재 ./)에 복사합니다.