특정 이름의 파일을 다른 폴더에 복사

특정 이름의 파일을 다른 폴더에 복사

파일이 많은 폴더가 있습니다. 다음 이름(공백으로 구분)으로 시작하는 모든 파일을 복사하고 싶습니다.

abc abd aer ab-x ate

다른 폴더로. 어떻게 해야 하나요?

답변1

csh, tcsh, ksh93, bash와 함께 사용할 수 있습니다 fish.zsh -o cshnullglob버팀대 확장그리고와일드카드이렇게 하려면( --이러한 파일 이름은 필요하지 않지만 단지 예일 뿐이라고 생각합니다):

cp -- {abc,abd,aer,ab-x,ate}* dest/

중괄호 확장을 사용하지 않으려면 for 루프를 사용할 수 있습니다(여기서는 POSIX/Bourne 스타일 구문).

for include in abc abd aer ab-x ate; do
    cp -- "$include"* dest/
done

파일 수가 많은 경우 cp각 포함이 한 번 호출되므로 속도가 느려질 수 있습니다. 또 다른 방법은 배열을 채우고 거기에서 시작하는 것입니다(여기 ksh93또는 zsh최근 bash구문).

files=()
includes=(abc abd aer ab-x ate)

for include in "${includes[@]}"; do
    files+=( "$include"* )
done

cp -- "${files[@]}" dest/        

답변2

중괄호 확장 및 와일드카드에 대한 참고 사항입니다.

브레이크 확장은 와일드카드가 아닙니다(비록 다른 쉘에서와 같이 원래 위치인 csh/tcsh에서는 구별이 명확하지 않지만). 실행된다앞으로와일드카드.

따라서 다음을 수행할 때:

cp {a,b}* /dest

먼저 이것을 다음과 같이 확장합니다.

cp a* b* /dest

이는 쉘이 두 개의 글로브를 확장해야 함을 의미합니다. 즉, 전체 파일 목록을 두 번 가져와서 어떤 파일이 패턴과 두 번 일치하는지 확인해야 합니다.

zsh이는 또한 어떤 glob이 어떤 파일과도 일치하지 않으면 전체 명령이 취소된다는 것을 의미합니다( cshnullglobcsh에서처럼 옵션을 실행하도록 활성화하여 이 문제를 해결할 수 있습니다).

이는 또한 다음을 의미합니다.

cp {a,ab}* /dest

cp파일이 두 번 복사됩니다 ab*.

이는 다음과 다릅니다.

cp @(a|b)* /dest

또는 ksh또는 bash -O extglob또는 zsh -o kshglob또는

cp (a|b)* /dest

zsh. 거기에만하나glob은 더 효율적이며 파일은 한 번만 포함됩니다.

zsh배열에 접두사 목록이 있는 경우 사용합니다 .

prefixes=(abc abd aer ab-x ate)
cp -- (${(j:|:)~prefixes})* /dest

(위에서 접두사는 와일드카드로 처리됩니다.) 즉, 배열의 요소를 연결하고 |결과를 glob( ~)으로 처리합니다.

목록이 크면 다음 cp과 같이 실행이 실패 할 수 있습니다."매개변수 목록이 너무 깁니다"실수. 이 경우 zshmodule()을 로드하여 내장 버전을 사용할 수 있습니다.cpzsh/fileszmodload zsh/files

답변3

  1. 예를 들어, 현재 디렉터리에 다음 파일이 있습니다.

    1-s2.0-S0038092X0000058X-main.pdf  ANNDHW.pdf     HPcalculation2
    1-s2.0-S0306261999000422-main.pdf  ANNlee.pdf     HPcalculation3
    ANNCanada.pdf                      HPcalculation  HPcalculation4
    
  2. HP에서 시작하는 모든 파일을 다음 폴더로 이동하고 싶습니다../NewFolder/

  3. 저 할 수 있어요:

    cp ./HP* ./NewFolder/
    

    ./HP*내가 HP에서 시작하는 모든 파일에 관심이 있다고 Linux에 알릴 것입니다. 대신에 모든 것을 로 옮기고 싶을 때 다음을 입력 .pdf할 수 있습니다 .*.pdf

    cp ./*.pdf ./NewFolder/
    

답변4

간단하게 할 수 있습니다

 cp abc* abd* aer* ab-x* ate*  DestinationPath

스케일링 문제에 대한 해결책은 다음과 같습니다.

  1. 모든 파일 이름을 목록에 넣으세요(예: list0.txt).
  2. 모두 복사

    cp `cat list0.txt` DestinationPath # 파일 이름에는 공백이 필요하지 않습니다.

    아니면 더 나은,

    -r 파일을 읽을 때 cp "$file" dest/를 실행합니다.

노트:

  • "$file" 공백이 있는 이름을 처리할 수 있기 때문입니다.One Package.deb
  • -r이스케이프 시퀀스로부터 사용자를 보호합니다.

    -r 백슬래시는 이스케이프 문자로 작동하지 않습니다. 백슬래시는 줄의 일부로 간주됩니다. 특히 백슬래시-개행 쌍은 줄 연속 문자로 사용할 수 없습니다.

관련 정보