나는 명령줄 디렉터리를 가져와 스크립트가 실행되는 현재 디렉터리에 모든 내용을 추출하는 간단한 쉘 스크립트를 만들었습니다.
#!/bin/bash
cp -v -R $1/* .
이를 확장하고 싶습니다. 디렉터리 A의 모든 PNG 파일을 추출하고 싶다고 가정해 보겠습니다.오직PNG 파일입니다.
처음에는 .png로 끝나는 모든 파일을 디렉토리에서 검색하여 분류하려고 생각했는데, 이 파일들만 디렉토리에 복사하는 방법을 모르겠습니다.
답변1
누구나
find "$1" -name '*.png' -exec cp -v -- {} ./ \;
또는 (GNU 사용 cp
) 더 효율적인 방법
find "$1" -name '*.png' -exec cp -vt ./ -- {} +
또는 쉘이 이를 지원하는 경우 globbing을 사용할 수 있습니다.bash
shopt -s globstar
cp -v -- "$1"/**/*.png ./
답변2
복사가 복잡해질 때 rsync
종종 유용합니다 .
rsync -mva --include '*/' --include '*.png' --exclude '*' "$1/" .
그러나 실제로 실행하기 전에 테스트 실행(옵션 -n
:)을 수행하여 원하는 대로 작동하는지 확인할 수 있습니다.
rsync -nmva --include '*/' --include '*.png' --exclude '*' "$1/" .
어떻게 작동하나요?
-v
(선택 사항) rsync에 무슨 일이 일어나고 있는지 확인할 수 있도록 자세히 설명하도록 지시합니다.-a
(선택 사항) 속성을 보존하도록 rsync에 지시합니다.--include '*/'
모든 디렉터리를 포함하도록 rsync에 지시--include '*.png'
.png
접미사가 있는 모든 파일을 포함하도록 rsync에 지시합니다 .--exclude '*'
위와 일치하지 않는 파일을 제외하도록 rsync에 지시합니다.-m
수신 측에서 비어 있는 디렉터리를 복사하지 않도록 rsync에 지시합니다.
포함/제외 옵션은 순서대로 지정해야 합니다.
답변3
분명히 bash를 사용하고 있으므로 globstar
파일 이름 확장 기능을 사용할 수 있습니다.
shopt -s globstar
cp **/*.png /some/destination
파일 이름 충돌에 주의하세요. 단 하나의 파일 이름만 복사본에서 유지됩니다!