모든 파일이 아닌 일부를 복사하는 방법은 무엇입니까?


54

따라서 디렉토리 컨텍스트 내에서 *사용할 때 모든 파일에 대해 와일드 카드로 사용할 수 있습니다 cp. 파일을 제외한 모든 파일을 복사하는 방법이 x있습니까?

답변:


42

에서 bash사용할 수 extglob:

 $ shopt -s extglob  # to enable extglob
 $ cp !(b*) new_dir/

여기서 !(b*)모든 제외 b*파일을.

나중에 해제 할 수 있습니다 extglob

 $ shopt -u extglob

tcsh 쉘과 동등한 것이 있는지 알고 있습니까?
Levon

불행히도 나는 그렇지 않습니다. 다음과 같은 find유일한 방법 인 것 같습니다 tcsh:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
rush

50

Rsync는 이것을 잘 처리합니다.

모두 복사 예 : rsync -aP /folder1/* /folder/2

제외와 함께 모두 복사 예 : rsync -aP --exclude=x /folder1/* /folder2/

-aP스위치 :

a : cp -a, recursive 등과 유사합니다 . P : rsync의 훌륭한 기능인 진행률을 보여줍니다.


5
일반적인 rsync 제외 목록에 대한 간단한 안내서는 이 답변 을 참조하십시오 .
Gilles

1
darwin / MacOS에서는 되풀이 -rP대신 사용하십시오 -aP. -a보관 용입니다. 이것이 변경되었는지 또는 MacOS와 다른지 확실하지 않습니다.
jpoveda 2016 년

rsync재귀 적으로 만들 수있는 옵션이 있습니다. 예 : rsync --recursive -P --exclude=x /folder1/* /folder2/. (우분투에서만 테스트)
n1k31t4

12

이것은의 기능이 아니며 cp쉘의 기능입니다 ( *도트가 아닌 모든 파일을 의미 하도록 확장 됨 ). 대답은 사용중인 쉘에 따라 다릅니다. 예를 들어 zsh다음 구문을 지원합니다.

$ cp ^x /path/to/destination

여기서 ^x"를 제외한 모든 파일 x"

예를 들어 xyz가 포함 된 파일을 제외한 모든 wav 파일을 복사하기 위해 선택 및 선택 취소 패턴을 결합 할 수도 있습니다.

cp *.wav~*xyz*

에 대한 의견 bash?
채드 해리슨

@hydroparadise 나는 bash에 대해 많이 모른다. 그러나이 답변 은 그것을 다루는 것처럼 보인다
Michael Mrozek

tcsh는 어떻습니까? 누구 알아?
Levon

4

고급 셸 globbing 또는 기본 제공 제외 옵션이있는 명령을 사용하는 것보다 훨씬 덜 우아한 방법으로 표준 도구를 사용하여 다양한 방법으로 일반 오래된 (휴대용 / 호환 가능한) Bourne 셸에서 수행 할 수도 있습니다.

파일이 너무 많지 않은 경우 (공백 및 / 또는 줄 바꿈을 포함한 이름이없는) 방법은 다음과 같습니다.

cp `ls | egrep -v '^excludename$'` destdir/.

물론 bashGNU 도구는 강력하고 강력하지만 항상 사용할 수있는 것은 아닙니다. 이식 가능한 스크립트에 넣으려면 findRush의 의견과 같이 권장 합니다.


2
나는 당신의 대답의 마지막 부분이 당면한 주제에서 산만하다는 것을 알았습니다. 게다가 "유닉스"는 더 이상 금본위 제가 아닙니다. 이 사이트의 제목이 "Unix and Linux"임에도 불구하고 무언가가 "Unix"이거나 더 이상 그렇지 않은 경우에는 관련이 없습니다.
Alexander

2
승인. 대신 주석을 여기로 옮겼습니다. Unix는 GNU가 아닙니다. 나는 물건의 "유닉스"가 그다지 흥미롭지 않다는 것에 동의하지만, 나는 여전히 이식성을 믿고 당신의 역사에 대해 조금 알고 있습니다.
MattBianco

거기에 당신과 완전히 동의합니다.
Alexander

2

폴더의 모든 항목 (하위 폴더 포함)을 특정 하위 디렉토리로 복사하려면 다음을 수행하십시오.

cp -R $(ls | grep -v '^subdir$') subdir/

sh, bash, zsh (적어도)와 함께 작동합니다.


1
이 같은 의도하지 나를 설득cp -R * subdir/
roaima

1
"cp -R * subdir /"명령을 사용하면 bash / zsh는 'subdir'을 반복적으로 복사하려고했습니다. "이름이 너무 깁니다 (복사하지 않음)"라는 오류가 발생합니다.
user2707671

좋은 지적. 귀하의 제안은 cp( bash/가 아닌 sh) " cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’" 경고를 피하려고합니다 . 그러나 복사가 올바르게 완료됩니다. 불행히도 변형은 공백이나 셸 구분 구두점을 포함하는 파일 이름으로 중단됩니다. 참조 unix.stackexchange.com/q/128985/135943
roaima

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.