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
찾기 출력을 디렉터리 이름으로 자르고 중복 항목을 제거합니다. 마지막으로 누락된 파일을 생성하면서 폴더를 반복합니다.sort
uniq
cp -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
확장자가 .인 모든 파일을 찾으려면 .py
OS X 셸에서 작동해야 합니다.
find . *.py -print0 | xargs -0 -I{} cp -r {} /some/dir/name/
노트:
find -print0
개행 문자 대신 널 문자로 끝나는 파일을 인쇄하며xargs -0
이 형식의 입력에 사용됩니다. 이는 종종 골칫거리가 될 수 있는 공백이나 기타 공백이 포함된 파일 이름과 경로를 더 잘 처리하기 위한 것입니다.find
OS X는 Linux/ GNU 와 다른 버전을 사용cp
하므로이것예제는 GNU 유틸리티와 함께 사용되며, GNU 유틸리티를 사용하는 유사한 질문에 대한 많은 예제 또는 답변이 사용됩니다.원하지 않는다OS X에서 작동합니다.