'cp'명령을 사용하여 특정 디렉토리를 제외시키는 방법은 무엇입니까?


411

특정 하위 디렉토리의 일부 파일을 제외한 디렉토리의 모든 파일을 복사하고 싶습니다. 'cp'명령에 --exclude 옵션이 없다는 것을 알았습니다. 어떻게 이것을 달성 할 수 있습니까?



6
tar -c | tar -x?
mvds

1
@mvds, tar에 '--exclude'를 사용하는 것이 좋습니다.
Huang F. Lei

답변:


704

rsync는 빠르고 쉽습니다.

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude

--exclude여러 번 사용할 수 있습니다 .

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude

dir thefoldertoexcludeafter --exclude옵션은 sourcefolder, 즉 sourcefolder/thefoldertoexclude.

또한 -n드라이 런을 추가 하여 실제 작업을 수행하기 전에 복사 할 내용을 확인할 수 있으며 모든 것이 정상이면 -n명령 줄에서 제거하십시오 .


3
합의, 당신의 단순성 및 전원 이길 수 없습니다--exclude
마태 복음 Wilcoxson

31
는 IS thefoldertoexclude받는 상대 sourcefolder또는 현재 작업 디렉토리는? 감사합니다
Beebee

46
소스 폴더를 기준으로합니다. 그러면 source / .git 폴더가 복사되지 않습니다. rsync
-r-

15
어쩌면 틀렸을 수도 있지만 "매개 변수"앞에 "스위치"를 추가하는 것이 좋습니다. 또한 rsync 보고서의 맨 페이지는 "="구문을 사용하거나 사용하지 않고 사용 가능한 것을 제외합니다. 따라서 운영 체제 전체에서 표준화 rsync -av --progress --exclude="thefoldertoexclude" sourcefolder /destinationfolder하려면 찾기 대신 rsync를 위해 upvote를 사용해야 {}합니다.
Xavi Montero

1
로컬 컴퓨터에 원격 서버에서 코스 등의 @mamun : $ rsync user@example.com:/var/www/mypage /var/www/mylocalpage/또는 로컬에서 원격으로$ rsync /var/www/mylocalpage/ user@example.com:/var/www/mypage
sobi3ch

84

모든 파일 형식 파일 (cp, mv, rm, tar, rsync, scp 등)이 특정 파일 이름 패턴을 제외해야한다면 엄청난 노력의 중복이 발생할 것입니다. 대신, 그러한 일은 글 로빙의 일부로 수행 할 수 있습니다 .

세게 때리다

man 1 bash, / extglob .

예:

$ shopt -s extglob
에코 이미지 / *
images / 004.bmp images / 033.jpg images / 1276338351183.jpg images / 2252.png
$ echo images /! (*. jpg)
images / 004.bmp images / 2252.png

그래서 당신은 안에 패턴을 넣고 !()일치를 무효로합니다. 이 패턴은 Vanwaril이 다른 답변에서 보여주는 것처럼 개별 경로 열거부터 시작 !(filename1|path2|etc3)하여 별과 문자 클래스가있는 정규 표현식과 같은 것들에 이르기까지 임의로 복잡 할 수 있습니다 . 자세한 내용은 맨 페이지를 참조하십시오.

zsh

man 1 zshexpn, / 파일 이름 생성 .

setopt KSH_GLOBbash 같은 패턴을 사용하고 사용할 수 있습니다 . 또는,

EXTENDED_GLOB 설정 %
에코 이미지 / *
images / 004.bmp images / 033.jpg images / 1276338351183.jpg images / 2252.png
에코 이미지 % / * ~ * .jpg
images / 004.bmp images / 2252.png

따라서 x~ypattern과 일치 x하지만 pattern 은 제외합니다 y. 다시 한 번 자세한 내용은 맨 페이지를 참조하십시오.


새로운 물고기 !

물고기 쉘은이 훨씬 예뻐 응답 이에를 :

🐟 cp (문자열 일치 -v '* .excluded.names'-srcdir / *) destdir

보너스 프로 팁

을 입력 cp *하고 누르십시오 CtrlX*. 무슨 일이 일어나는지보십시오. 해롭지는 않아 약속 해


@MikhailGolubtsov는 아마도 globbing이 재귀 적이 지 않고 한 번에 한 수준으로 작동하기 때문일 것입니다. 편집했습니다. 추신 : 그것은 작동합니다 zsh.
ulidtko

3
좋은 프로 팁! 이렇게하면 단일 항목을 쉽게 제거 할 수 있습니다. 고마워요!
taffit

Bash에서 확장 패턴 일치 기능을 끄려면 BTW를 실행하십시오 setopt -u extglob.
Rockallite

49

rsync할 수있을 때 사용하는 이유 :

find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'

이것은 목표 디렉토리 구조가 소스와 동일하다고 가정합니다.


8
난 당신이 필요하다고 생각 -path, -iname하지 테스트 경로 계층에 인수
제임스 Murty

3
그리고 마지막에 세미콜론이 필요합니다.find . -type f -not -path '*/not-from-here/*' -exec cp '{}' '/dest/{}' \;
Matthew Wilcoxson

1
와우, 나에게 "편집은 6 자 이상이어야한다"라고 할 수 없습니다!
Matthew Wilcoxson

1
@MatthewWilcoxson Meh. 더 많은 담당자를 얻으면 이러한 제한이 해제됩니다. 그에 따라 답변을 편집했습니다. 다시 감사합니다!
Linus Kleen 2013

1
@Henning 왜 안돼 rsync? Coz 시스템에 없을 수도 있습니다! 반면 find, cp자신의 장소에 항상이다. 아니면 간단한 일을하기 위해 2gigs의 물건을 설치 한 사람들의 종류입니까?
Reishin

37
cp -r `ls -A | grep -v "c"` $HOME/

1
Windows 10 .sh에서 나를 위해 일했습니다
atwellpub

하나의 파일 또는 디렉토리의 제외와 사용자 정의 소스 경로의 사용을 단순화하는 쉘 기능을 만들었습니다. # $1 = source path # $2 = destination path # $3 = filter copy_from_source_to_destination_except_filter() { cp -r $(ls -A $1 | grep -v -w $3 | awk -v path=$1 '{printf "%s/%s ", path, $1}') $2 }
ElectRocnic

공백이있는 디렉토리에서는 실패
Sérgio

27

내가 찾은 가장 쉬운 방법은 괄호 안에 파일 이름을 추가하여 파일과 폴더를 제외한 모든 파일을 복사 할 수 있습니다.

shopt -s extglob
cp -r !(Filename1 | FoldernameX | Filename2) Dest/

9
나를 위해 작동하지 않습니다. 나는 얻는다-bash: !: event not found
geneorama

8
shopt -s extglob (cp, rm 및 기타에서!를 활성화하려면 이것을 실행하십시오)
imkost


10

소스 디렉토리와 관련이 있습니다.
이렇게하면 디렉토리 source/.git가 복사되지 않습니다.

rsync -r --exclude '.git' source target

최고 답변과의 차이점 / 개선은 무엇입니까?
활동 감소

8

rsync

rsync -r --verbose --exclude 'exclude_pattern' ./* /to/where/

먼저 -n 옵션을 사용하여 복사 할 내용을 확인하십시오.


최고 답변과의 차이점 / 개선은 무엇입니까?
활동 감소

7

bash 또는 dash를 사용한다고 가정합니다. 이게 효과가 있을까요?

shopt -s extglob  # sets extended pattern matching options in the bash shell
cp $(ls -laR !(subdir/file1|file2|subdir2/file3)) destination

원하지 않는 파일을 제외하고 ls를 수행하고 cp의 첫 번째 인수로 사용


9
여분을 건너 뛰고 ls간단히 할 수 있습니다 cp !(file1|file1) dest.
Shawn Chin

-laR을 사용하지 마십시오. cp를 방해하는 문자열을 추가합니다. cp $(ls folder/!exclude_folder0|exclude_folder1)) dest
LAL

5

또 다른 간단한 옵션은 --exclude-dir 옵션이있는 rsync를 설치하고 사용하는 것이며 로컬 및 원격 파일 모두에 사용할 수 있습니다.


4

rsync실제로 꽤 까다 롭습니다. 작동하려면 여러 테스트를 수행해야합니다.

복사 /var/www/html하고 /var/www/dev싶지만 크기 때문에 디렉토리 를 제외 해야 한다고 가정 해 봅시다 /var/www/html/site/video/. 명령은 다음과 같습니다.

rsync -av --exclude 'sites/video' /var/www/html/ /var/www/dev

몇 가지 주의 사항 :

  1. /소스 의 마지막 슬래시 가 필요합니다. 그렇지 않으면 컨텐츠가 아닌 소스 디렉토리도 복사되어 /var/www/dev/html/xxxx원하는 것이 아닙니다.
  2. 다음은 --exclude경로는 상대 를 직접 소스. 완전한 절대 경로를 설정하더라도 작동하지 않습니다.

  3. -vverbose, -ais for archive 모드는 재귀 를 원하고 거의 모든 것을 보존하려는 것을 의미합니다 .


특수 문자와 공백을 처리하는 간단한 솔루션
Sérgio

현재 최고 답변과 달리 매개 변수를 설명해 주셔서 감사합니다.
활동 감소

3
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir

편집 : 대상 경로를 제외하는 것을 잊었습니다 (그렇지 않으면 재귀 적으로 복사합니다).


4
공백이 포함 된 디렉토리 항목을주의하십시오.
Paulo Scardine

3

이것은 Linus Kleen의 답변을 수정 한 것입니다. 그의 대답은 나를 위해 작동하지 않았습니다. cp가 싫어하는 파일 경로 앞에 추가되었습니다 (경로는 source / .destination / file과 유사합니다).

이 명령은 저에게 효과적이었습니다.

find . -type f -not -path '*/exlude-path/*' -exec cp --parents '{}' '/destination/' \;

--parents 명령은 디렉토리 구조를 유지합니다.


2

임시 디렉토리를 숨겨진 디렉토리로 옮기고 원하는 경우 이름을 바꿉니다.

mkdir .hiddendir
cp * .hiddendir -R
mv .hiddendir realdirname

1
아마도 그럴 수는 없지만, 이것이 내가 찾은 유일한 옵션 cp이며 표준 POSIX 쉘과 같은 것 sh입니다.
tomekwi

1
이 답변은 과소 평가되었습니다. 이것은 가장 호환 가능하고 읽기 쉽고 이해하기 쉬운 답변입니다. Kudos, 나는 왜 그것을 생각하지 않았는지 모르겠다.
Robert Talada

감사합니다 @RobertTalada, 지금까지 대답은 얼마나 멀리 갈까요? ️‍🌈
lama12345

1
mv tobecopied/tobeexcluded .
cp -r tobecopied dest/
mv tobeexcluded tobecopied/

0

"do while"루프를 사용하여 find 명령의 출력을 읽습니다. 이 예에서는 원하지 않는 것보다 원하는 패턴 일치 수가 제한되어 있기 때문에 특정 패턴을 제외하지 않고 일치시킵니다. -iname 플래그 앞에 -not을 사용하여 논리를 되돌릴 수 있습니다.

    find . -type f -iname "*.flac" -o -print0 -iname "*.mp3" -print0 -o -iname "*.wav" -print0 -o -iname "*.aac" -print0 -o -iname "*.wma" -print0 | while read -d $'\0' file; do cp -ruv "$file" "/media/wd/network_sync/music/$file"; done

위의 내용을 사용하여 / media / wd에 마운트 한 Western Digital TV Live Hub의 파일보다 서버에서 최신 인 모든 음악 유형 파일을 복사합니다. 제외하고 싶은 DVD 파일, mpeg 등이 많기 때문에 위의 내용을 사용합니다. 어떤 이유로 rsync가 복사되는 것처럼 보이기 때문에 wd 장치를 본 후에는 파일이 없습니다에도 불구하고 파일이 없습니다. 이 명령으로 rsync 중 오류가 발생했습니다 :

    rsync -av --progress --exclude=*.VOB --exclude=*.avi --exclude=*.mkv --exclude=*.ts --exclude=*.mpg --exclude=*.iso --exclude=*ar --exclude=*.vob --exclude=*.BUP --exclude=*.cdi --exclude=*.ISO --exclude=*.shn --exclude=*.MPG --exclude=*.AVI --exclude=*.DAT --exclude=*.img --exclude=*.nrg --exclude=*.cdr --exclude=*.bin --exclude=*.MOV --exclude=*.goutputs* --exclude=*.flv --exclude=*.mov --exclude=*.m2ts --exclude=*.cdg --exclude=*.IFO --exclude=*.asf --exclude=*.ite /media/2TB\ Data/data/music/* /media/wd/network_sync/music/

0
ls -I "filename1" -I "filename2" | xargs cp -rf -t destdir 

첫 번째 부분은 ls모든 파일이지만 플래그가있는 특정 파일은 숨겨져 있습니다 -I. 의 출력은 ls두 번째 부분의 표준 입력으로 사용됩니다. 표준 입력에서 xargs명령 cp -rf -t destdir을 빌드하고 실행하십시오 . 플래그 -r수단은 재귀 적 디렉토리를 복사 할 -f수단이있는 파일을 덮어 쓰기 할 강제로 파일을 복사 destdir, -t로 대상 디렉토리의 사본을 지정합니다.


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