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

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



답변

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명령 줄에서 제거하십시오 .


답변

모든 파일 형식 파일 (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*. 무슨 일이 일어나는지보십시오. 해롭지는 않아 약속 해


답변

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

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

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


답변

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


답변

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

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


답변

mvds의 의견을 확장 하면 이것이 나를 위해 작동합니다.

cd dotfiles
tar -c --exclude .git --exclude README . | tar -x -C ~/dotfiles2


답변

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

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