특정 확장자를 가진 파일이 포함된 모든 폴더를 복사합니다.

특정 확장자를 가진 파일이 포함된 모든 폴더를 복사합니다.

Mac 터미널에서 지정된 확장자를 가진 파일이 하나 이상 포함된 모든 디렉터리를 찾아 다른 위치에 복사하고 싶습니다. 파일이 포함된 모든 디렉토리를 find . -iname '*.jpg' -exec dirname {} \;찾는 것 같았 지만 *.jpg파일을 복사하는 방법을 잘 모르겠습니다. 나는 그것을 사용해 보았지만 rsync제대로 작동하지 못했습니다. 가장 좋은 접근 방식은 무엇입니까?

답변1

이것은 bash디렉토리 구조를 유지하면서 jpg가 포함된 모든 폴더를 백업이라는 폴더에 복사하는 친숙한 한 줄 입니다.

mkdir backup; for folder in $(find . -type f -name '*.jpg' | sed -r 's|/[^/]+$||' |sort |uniq); do cp -r --parents $folder backup; done

먼저 빈 폴더를 만든 backup다음 find명령은 . 로 시작하는 파일을 찾고 .jpg명령은 sed찾기 출력을 디렉터리 이름으로 자르고 중복 항목을 제거합니다. 마지막으로 누락된 파일을 생성하면서 폴더를 반복합니다.sortuniqcp -r --parents

이와 같은 플래그를 sed -r사용하여 -printf우회 할 수 있습니다.find

mkdir backup; for folder in $(find . -type f -name '*.jpg' -printf "%h\n" |sort |uniq); do cp -r --parents $folder backup; done

find지원하지 않으면 사용해 -printf볼 수 있습니다.grep

mkdir backup; for folder in $(find . -type f -name '*.jpg' | grep -o "\(.*\)/" |sort |uniq); do cp -r --parents $folder backup; done

답변2

확장자가 .인 모든 파일을 찾으려면 .pyOS X 셸에서 작동해야 합니다.

find . *.py -print0 | xargs -0 -I{} cp -r {} /some/dir/name/

노트:

  • find -print0개행 문자 대신 널 문자로 끝나는 파일을 인쇄하며 xargs -0이 형식의 입력에 사용됩니다. 이는 종종 골칫거리가 될 수 있는 공백이나 기타 공백이 포함된 파일 이름과 경로를 더 잘 처리하기 위한 것입니다.
  • findOS X는 Linux/ GNU 와 다른 버전을 사용 cp하므로이것예제는 GNU 유틸리티와 함께 ​​사용되며, GNU 유틸리티를 사용하는 유사한 질문에 대한 많은 예제 또는 답변이 사용됩니다.원하지 않는다OS X에서 작동합니다.

관련 정보