파일이 많은 폴더가 있습니다. 다음 이름(공백으로 구분)으로 시작하는 모든 파일을 복사하고 싶습니다.
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이 어떤 파일과도 일치하지 않으면 전체 명령이 취소된다는 것을 의미합니다( 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
module()을 로드하여 내장 버전을 사용할 수 있습니다.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/를 실행합니다.
노트:
- "$file" 공백이 있는 이름을 처리할 수 있기 때문입니다.
One Package.deb
-r
이스케이프 시퀀스로부터 사용자를 보호합니다.-r 백슬래시는 이스케이프 문자로 작동하지 않습니다. 백슬래시는 줄의 일부로 간주됩니다. 특히 백슬래시-개행 쌍은 줄 연속 문자로 사용할 수 없습니다.