특정 하위 디렉토리의 일부 파일을 제외한 디렉토리의 모든 파일을 복사하고 싶습니다. 'cp'명령에 --exclude 옵션이 없다는 것을 알았습니다. 어떻게 이것을 달성 할 수 있습니까?
tar -c | tar -x
?
특정 하위 디렉토리의 일부 파일을 제외한 디렉토리의 모든 파일을 복사하고 싶습니다. 'cp'명령에 --exclude 옵션이 없다는 것을 알았습니다. 어떻게 이것을 달성 할 수 있습니까?
tar -c | tar -x
?
답변:
rsync는 빠르고 쉽습니다.
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude
--exclude
여러 번 사용할 수 있습니다 .
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude
dir thefoldertoexclude
after --exclude
옵션은 sourcefolder
, 즉 sourcefolder/thefoldertoexclude
.
또한 -n
드라이 런을 추가 하여 실제 작업을 수행하기 전에 복사 할 내용을 확인할 수 있으며 모든 것이 정상이면 -n
명령 줄에서 제거하십시오 .
--exclude
thefoldertoexclude
받는 상대 sourcefolder
또는 현재 작업 디렉토리는? 감사합니다
rsync -av --progress --exclude="thefoldertoexclude" sourcefolder /destinationfolder
하려면 찾기 대신 rsync를 위해 upvote를 사용해야 {}
합니다.
$ rsync user@example.com:/var/www/mypage /var/www/mylocalpage/
또는 로컬에서 원격으로$ rsync /var/www/mylocalpage/ user@example.com:/var/www/mypage
모든 파일 형식 파일 (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)
하여 별과 문자 클래스가있는 정규 표현식과 같은 것들에 이르기까지 임의로 복잡 할 수 있습니다 . 자세한 내용은 맨 페이지를 참조하십시오.
man 1 zshexpn
, / 파일 이름 생성 .
setopt KSH_GLOB
bash 같은 패턴을 사용하고 사용할 수 있습니다 . 또는,
EXTENDED_GLOB 설정 % 에코 이미지 / * images / 004.bmp images / 033.jpg images / 1276338351183.jpg images / 2252.png 에코 이미지 % / * ~ * .jpg images / 004.bmp images / 2252.png
따라서 x~y
pattern과 일치 x
하지만 pattern 은 제외합니다 y
. 다시 한 번 자세한 내용은 맨 페이지를 참조하십시오.
🐟 cp (문자열 일치 -v '* .excluded.names'-srcdir / *) destdir
을 입력 cp *
하고 누르십시오 CtrlX*. 무슨 일이 일어나는지보십시오. 해롭지는 않아 약속 해
zsh
.
setopt -u extglob
.
rsync
할 수있을 때 사용하는 이유 :
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
이것은 목표 디렉토리 구조가 소스와 동일하다고 가정합니다.
-path
, -iname하지 테스트 경로 계층에 인수
find . -type f -not -path '*/not-from-here/*' -exec cp '{}' '/dest/{}' \;
rsync
? Coz 시스템에 없을 수도 있습니다! 반면 find
, cp
자신의 장소에 항상이다. 아니면 간단한 일을하기 위해 2gigs의 물건을 설치 한 사람들의 종류입니까?
cp -r `ls -A | grep -v "c"` $HOME/
# $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 }
소스 디렉토리와 관련이 있습니다.
이렇게하면 디렉토리 source/.git
가 복사되지 않습니다.
rsync -r --exclude '.git' source target
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의 첫 번째 인수로 사용
ls
간단히 할 수 있습니다 cp !(file1|file1) dest
.
cp $(ls folder/!exclude_folder0|exclude_folder1)) dest
rsync
실제로 꽤 까다 롭습니다. 작동하려면 여러 테스트를 수행해야합니다.
복사 /var/www/html
하고 /var/www/dev
싶지만 크기 때문에 디렉토리 를 제외 해야 한다고 가정 해 봅시다 /var/www/html/site/video/
. 명령은 다음과 같습니다.
rsync -av --exclude 'sites/video' /var/www/html/ /var/www/dev
몇 가지 주의 사항 :
/
소스 의 마지막 슬래시 가 필요합니다. 그렇지 않으면 컨텐츠가 아닌 소스 디렉토리도 복사되어 /var/www/dev/html/xxxx
원하는 것이 아닙니다.다음은 --exclude
경로는 상대 를 직접 소스. 완전한 절대 경로를 설정하더라도 작동하지 않습니다.
-v
verbose, -a
is for archive 모드는 재귀 를 원하고 거의 모든 것을 보존하려는 것을 의미합니다 .
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir
편집 : 대상 경로를 제외하는 것을 잊었습니다 (그렇지 않으면 재귀 적으로 복사합니다).
임시 디렉토리를 숨겨진 디렉토리로 옮기고 원하는 경우 이름을 바꿉니다.
mkdir .hiddendir
cp * .hiddendir -R
mv .hiddendir realdirname
cp
이며 표준 POSIX 쉘과 같은 것 sh
입니다.
"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/