BASH는 하나를 제외한 모든 파일을 복사합니다.


110

Default.png라는 이름을 제외하고 모든 파일을 디렉토리에서 복사하고 싶습니다. 이를 수행하는 방법에는 여러 가지가있는 것 같습니다. 당신에게 가장 효과적인 것은 무엇입니까?


파일을 복사 한 후 삭제하는 대신 해당 파일을 건너 뛰기 위해 필요한 이유는 무엇입니까? 이미 대상 디렉토리에 있습니까?
Lasse V. Karlsen

1
예, 동일한 이름의 파일이 이미 대상 디렉토리에 있습니다.
Joe Cannatti

@ LasseV.Karlsen : 또는 대용량 파일 인 경우 복사 시간을 절약 할 수 있습니다. 나는 이것에 관심이 있지만 파일이 아닌 디렉토리를 제외합니다.
Nikana Reklawyks 2012

답변:


54

src/파일 만 포함하는 경우 간단 합니다.

find src/ ! -name Default.png -exec cp -t dest/ {} +

경우 src/하위 디렉토리,이 생략합니다을 가지고 있지만, 그 내부에 파일 복사 작업을 수행합니다

find src/ -type f ! -name Default.png -exec cp -t dest/ {} +

src/하위 디렉터리가있는 경우 해당 디렉터리로 반복되지 않습니다.

find src/ -type f -maxdepth 1 ! -name Default.png -exec cp -t dest/ {} +

5
OS X는 glob이 활성화되지 않은 상태로 배송되는 것처럼 보이기 때문에 이것이 나에게 가장 좋은 것으로 판명되었습니다.
Joe Cannatti

6
@Max \;는 파일 당 한 번씩 명령을 실행합니다. +명령을 한 번 실행하고 모든 파일 이름을 한 번에 전달합니다 (명령 줄 길이 제한에 따름). +일반적으로 좀 더 효율적입니다.
John Kugelman 2014 년

149

다음과 같아야합니다.

cp -r !(Default.png) /dest

현재 폴더에 중첩 된 폴더로 복사하는 경우 (아래의 경우 예라고 함) 해당 디렉토리도 생략해야합니다.

cp -r !(Default.png|example) /example

17
! :이 -bash 생산하는 이벤트를 찾을 수 없습니다
조 Cannatti

복사 한 폴더 내에 중첩 된 폴더로 파일을 복사하고 있습니까?
Jon

47
shopt -s extglob비활성화 된 경우 작동 해야 합니다.
Barry Kelly

5
shopt -s extglob@BarryKelly가 설명한대로 OS X를 사용해야하는 것 같습니다 . 그것으로 완벽하게 작동합니다.
Kat

Bash에 대해 몇 년 동안 몰랐습니다 !()... Beautiful! 저와 같은 사람들을 위해 bash 를 공부 / 검토 할 때라고 느끼는 사람들을 위해이 질문 / 답변과 관련된 관련 링크가 있습니다 : shopt / extglob and the pattern .
Brandt

73

rsync는 오랫동안 내 cp / scp 대체품이었습니다.

rsync -av from/ to/ --exclude=Default.png

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose               increase verbosity

두 개의 다른 파일을 제외하려면 어떻게 사용합니까?
Pulkit Bansal 2018

여러 --exclude = 인수가 지원됩니다. 그리고 잊지 마세요 -r당신이 디렉토리를 동기화하는 경우 인수를
리안 샌더슨에게

5

난 그냥 할거야 :

cp srcdir/* destdir/ ; rm destdir/Default.png

파일이 크지 않는 한. 그렇지 않으면 사용 예

find srcdir -type f/ |grep -v Default.png$ |xargs -ILIST cp LIST destdir/

1
첫 번째 명령은 OP가 요청한 것이 아닙니다. Default.png두 디렉토리에있는 경우 의 하나를 destdir의 하나로 srcdir바꾼 다음 복사 된 Default.png. 대신 OP는 Default.png이미 존재하는 destdir.
SnowFrog

2
default.png는 이미 destdir에 있습니까? 당신의 solutioun은 작동하지 않습니다.
Iman Mohamadi

2

이것은 노드 모듈을 제외한 모든 것을 복사하는 데 효과적입니다. :) 즐기며 위의 답변 덕분에 방금 추가했습니다. Rsync는 요청하지 않고 진행률 표시 줄을 볼 수 있으므로 CP보다 제 생각에 더 좋습니다.

   rsync -av fromDirectory/ ToDirectory/ --exclude=node_modules



-2

정규식과 함께 쉘의 확장 매개 변수 사용

cp /<path>/[^not_to_copy_file]* .

not_to_copy_file을 제외한 모든 것이 복사됩니다.

-이것에 문제가있는 경우. 명시 해주세요 !


1
SO에 오신 것을 환영합니다. 불행히도 귀하의 대답은 정확하지 않습니다. 대괄호 표현 ( [...])은 일치시킬 문자 세트를 포함하고, 선행 ^은 나열된 문자의 보완 일치를 유발합니다. 다음 예에서는 어떤 파일도 나열되지 않습니다 touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*. 다음 문자로 시작하는 모든 파일 이름이 제외되기 때문 _cefilnopty입니다..
rtx13
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.