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

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

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

abc abd aer ab-x ate

다른 폴더로. 어떻게 해야 합니까?

답변1

, , , 또는csh​​tcshksh93bashfishzsh -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

중괄호 확장과 글로빙에 대한 참고 사항입니다.

Brace 확장은 글로빙되지 않습니다(다른 쉘에서 시작된 csh/tcsh에서는 구별이 명확하지 않지만). 수행된다~ 전에글로빙.

따라서 다음을 수행할 때:

cp {a,b}* /dest

먼저 다음으로 확장됩니다.

cp a* b* /dest

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

을 사용하면 zshglob 중 하나라도 파일과 일치하지 않으면 전체 명령이 취소됩니다( 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실패한다는 것을 알 수 있습니다."인수 목록이 너무 깁니다"오류. 이 경우 모듈( ) 을 로드하여 사용할 수 있는 zsh내장 버전을 사용할 수 있습니다 .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/ ; 완료 < list0.txt

노트:

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

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

관련 정보