일부 파일/디렉터리를 제외하기 위해 "--exclude-from"과 함께 tar 명령을 사용하는 Debian 8 시스템에 백업 스크립트를 작성했습니다.
/home/www-data/sites/<some_string>log.txt
이것은 훌륭하게 작동하지만 오늘은 또는 와 같은 동일한 경로 패턴을 공유하는 일부 파일을 제외하고 싶습니다 /home/www-data/sites/<one_or_two_directories>/vendor
.
/home/www-data/sites/*log.txt
파일에 추가를 시도했지만 tar가 실패하고 stderr에 다음 오류가 인쇄되었습니다.
tar: /home/www-data/sites/*log.txt: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
*
or 을(를) 사용하려고 할 때 뭔가 빠졌 나요 **
?
그럼 난 읽어Unix에서 와일드카드는 일반적으로 프로그램 자체에서 해석되지 않습니다.이는 tar *
도 확장하지 않음을 의미합니다 **
.
내가 아는 한, 나의 최후의 수단은 bash를 사용하여 목록을 확장하고 제외 파일을 호출하기 전에(아직 존재하지 않는 경우) 제외 파일에 추가하는 것입니다 tar
. 더 깨끗한 방법이 있습니까?
편집하다
다음은 스크립트 스니펫입니다.
# ...
broot=$(dirname "${PWD}")
i="${PWD}/list.include"
x="${PWD}/list.exclude"
o="$broot/archive.tgz"
tar -zpcf $o -T $i -X $x
# ...
제외파일입니다..
/etc/php5/fpm
/etc/nginx
/etc/mysql
/home/me/websites/*log.txt
/home/me/websites/**/vendor
목표는 "웹사이트" 디렉터리에 있는 모든 로그 파일과 "웹사이트"의 하위 디렉터리에서 찾을 수 있는 모든 "공급업체" 디렉터리를 제외하는 것입니다.
답변1
셸은 인수에서 와일드카드 문자를 확장하므로 대부분의 응용 프로그램에서는 와일드카드 확장을 수행할 필요가 없습니다. 그러나 tar의 제외 목록은하다기존 쉘에서 지원하는 것과 정확히 일치하는 와일드카드가 지원됩니다. 미묘한 차이가 있을 수 있습니다. 예를 들어 tar는 차이를 구분할 수 없지만 ksh, bash 및 zsh는 차이를 구분할 수 있습니다 *
. **
tar의 경우 *
문자를 포함한 모든 문자를 일치시킬 수 있으므로 예를 들어 /
계층 구조의 모든 수준에서 */.svn
호출된 파일은 제외됩니다. 디렉터리 구분 기호와 일치하지 않는 상황에서 사용할 수 있습니다 .svn
.tar --no-wildcards-match-slash
*
예를 들어 , 및 를 /home/me/websites/*log.txt
제외합니다 . 제외 제외 하지만 제외하지는 않습니다 . 이 옵션을 사용 하고 제외 하지 마십시오 ./home/me/websites/log.txt
/home/me/websites/foo-log.txt
/home/me/websites/subdir/log.txt
/home/me/websites/**/vendor
/home/me/websites/one/vendor
/home/me/websites/one/two/vendor
/home/me/websites/vendor
--no-wildcards-match-slash
/home/me/websites/*log.txt
/home/me/websites/subdir/log.txt
/home/me/websites/**/vendor
/home/me/websites/one/two/vendor
tar … --exclude='/home/www-data/sites/*include' …
/home/www-data/sites
이름이 .로 끝나는 파일 및 디렉터리를 제외합니다 include
. 따옴표 없이 이스케이프할 수 있지만 이렇게 작성하는 경우 (쉘이 --exclude /home/www-data/sites/*include
tar
와일드카드를 보기 전에 확장하기 때문) 또는 일치하지 않는 와일드카드에 대한 오류 신호를 보내는 쉘(예: 기본 zsh)을 사용하는 경우에는 불가능합니다. , 그건 그렇지 않을거야. 추천하고- 구성).
이 옵션에는 --exclude-from
파일 이름이 필요합니다. 파일에는 한 줄에 하나의 패턴이 포함되어야 합니다. --exclude
(다음에 패턴이 옴)과 --exclude-from
(다음에 패턴이 포함된 파일 이름이 옴)을 혼동하지 마십시오 .
답변2
명령이 잘못 인용되었을 수 있습니다(예상대로 작동하는지 빠르게 확인하려면 다음을 참조하세요). 참조 매뉴얼에 따르면 GNU tar는 쉘 와일드카드를 인식합니다:
-
--exclude-from=
문서
-X
문서
tar는 다음에 나열된 패턴과 일치하는 파일을 무시합니다.문서.