파일이 많은 폴더가 있습니다. 다음 이름으로 시작하는 모든 파일을 복사하고 싶습니다(공백으로 구분).
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
중괄호 확장과 글로빙에 대한 참고 사항입니다.
Brace 확장은 글로빙되지 않습니다(다른 쉘에서 시작된 csh/tcsh에서는 구별이 명확하지 않지만). 수행된다~ 전에글로빙.
따라서 다음을 수행할 때:
cp {a,b}* /dest
먼저 다음으로 확장됩니다.
cp a* b* /dest
이는 쉘이 두 개의 글로브를 확장해야 함을 의미합니다. 즉, 전체 파일 목록을 두 번 가져오고 패턴과 일치하는 파일을 두 번 확인해야 합니다.
을 사용하면 zsh
glob 중 하나라도 파일과 일치하지 않으면 전체 명령이 취소됩니다( cshnullglob
csh에서처럼 작동하도록 옵션을 활성화하여 문제를 해결할 수 있음).
이는 또한 다음을 의미합니다.
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
내장 버전을 사용할 수 있습니다 .cp
zsh/files
zmodload zsh/files
답변3
예를 들어 현재 디렉터리에 다음 파일이 있습니다.
1-s2.0-S0038092X0000058X-main.pdf ANNDHW.pdf HPcalculation2 1-s2.0-S0306261999000422-main.pdf ANNlee.pdf HPcalculation3 ANNCanada.pdf HPcalculation HPcalculation4
HP에서 시작하는 모든 파일을 폴더로 이동하고 싶습니다.
./NewFolder/
내가 할 수있는:
cp ./HP* ./NewFolder/
./HP*
내가 HP에서 시작하는 모든 파일에 관심이 있다고 Linux에 알릴 것입니다. 그 반대는 .로 끝나는 모든 파일을 이동하려는 경우입니다.pdf
.*
다음 앞에 넣을 수 있습니다.pdf
.cp ./*.pdf ./NewFolder/
답변4
간단하게 할 수 있습니다
cp abc* abd* aer* ab-x* ate* DestinationPath
확장된 문제에 대한 해결책은 다음과 같습니다.
- 모든 파일 이름을 목록(예: list0.txt)에 넣으세요.
모두 복사
cp `cat list0.txt` DestinationPath # 파일 이름에 공백이 필요하지 않습니다.
아니면 더 나은,
-r 파일을 읽는 동안; cp "$file" dest/ ; 완료 < list0.txt
노트:
- "$file" 내부에 공백이 있는 이름을 다음과 같이 처리할 수 있기 때문입니다.
One Package.deb
-r
이스케이프 시퀀스로부터 사용자를 보호합니다.-r 백슬래시는 이스케이프 문자로 작동하지 않습니다. 백슬래시는 줄의 일부로 간주됩니다. 특히 백슬래시-개행 쌍은 줄 연속으로 사용할 수 없습니다.