쉘의 디렉토리에서 특정 파일을 추출하는 방법은 무엇입니까?

쉘의 디렉토리에서 특정 파일을 추출하는 방법은 무엇입니까?

나는 명령줄 디렉터리를 가져와 스크립트가 실행되는 현재 디렉터리에 모든 내용을 추출하는 간단한 쉘 스크립트를 만들었습니다.

#!/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

파일 이름 충돌에 주의하세요. 단 하나의 파일 이름만 복사본에서 유지됩니다!

관련 정보