특정 파일 / 폴더를 제외한 tar 디렉토리에 대한 쉘 명령


810

특정 파일 / 폴더를 아카이브에서 제외하는 것을 지원하는 간단한 쉘 명령 / 스크립트가 있습니까?

백업 할 필요가없는 매우 큰 파일이 많은 서브 디렉토리로 아카이브해야하는 디렉토리가 있습니다.

확실한 해결책은 아닙니다.

tar --exclude=PATTERN명령은 지정된 패턴과 제외 해당 파일을 일치하지만 나는 특정 파일 및 폴더를 무시하는 (전체 파일 경로), 그렇지 않으면 유효한 파일이 제외 될 수 있어야합니다.

find 명령을 사용하여 파일 목록을 작성하고 아카이브하지 않고 목록을 tar에 전달하려는 파일을 제외시킬 수 있지만 소량의 파일에 대해서만 작동합니다. 나는 수만명이 있습니다.

유일한 해결책은 제외 할 파일 / 폴더 목록이있는 파일을 만든 다음 rsync with --exclude-from=file를 사용 하여 모든 파일을 tmp 디렉토리에 복사 한 다음 tar를 사용하여 해당 디렉토리를 아카이브하는 것입니다.

더 좋고 더 효율적인 솔루션을 생각할 수 있습니까?

편집 : Charles Ma 의 솔루션이 잘 작동합니다. 가장 큰 문제는 tar 명령의 시작 부분에 --exclude='./folder' 있어야 한다는 것 입니다. 전체 명령 (CD 우선, 백업은 해당 디렉토리를 기준으로 함) :

cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

120
또 다른 한가지는 그 날을 잡았 가치 메모 수 있습니다 : 슬래시 후행 에 타르가 발생할 제외 폴더의 말을 하지 전혀 해당 폴더를 제외합니다.
Rekhyt

7
@ Rekhyt 감사합니다, 나는 15 분 동안 명령을 쳐다보고 있었다 ... 다음 30
earcam

9
--exclude의 위치는 tar 버전에 따라 다릅니다. tar 1.23의 경우 --exclude는 기본 명령 뒤에옵니다.
Joel G Mathew

2
" '"(따옴표)를 잊지 마십시오.
Meetai.com

3
--exclude첫 번째 일 필요는 없지만 소스 디렉토리 앞의 어딘가에 와야합니다 (Cygwin에서 tar 1.29로 테스트).
wortwart

답변:


1038

tar에 대해 여러 제외 옵션을 사용할 수 있으므로

$ tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

등이 작동합니다. 확인 확인 넣어 --exclude 전에 소스 및 대상 항목.


78
이 대답은 --exclude가 먼저 나타나는 것처럼 보입니다 ... tar cvfpz ../stuff.tgz --exclude = 'node_modules'--exclude = '. git'.
James O'Brien

13
예를 들어, 업로드 폴더를 제외하고 wordpress 프로젝트 폴더를 백업하려는 경우 다음 명령을 사용할 수 있습니다. tar -cvf wordpress_backup.tar wordpress --exclude = wp-content / uploads
shasi kanth

12
나는 다음과 같은 명령 을 내렸다 : 플래그는 tar 파일 앞에 와야 tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz . 한다는 것을 주목하라 -f: superuser.com/a/559341/415047
Alfred Bez

21
제외 디렉토리의 끝에 "/"가 있으면 실패합니다. tar는 결말 /가 제외 할 디렉토리 이름의 일부라고 생각합니다. 나쁨 : --exclude = mydir / GOOD : --exclude = mydir
Josiah

4
> 소스 및 대상 항목 앞에 --exclude를 넣어야합니다. 또는 제외에 대한 절대 경로를 사용하십시오. tar -cvpzf backups / target.tar.gz --exclude = '/ home / username / backups'/ home / username
NightKnight on Cloudinsidr.com

131

--excludetar 와 함께 디렉토리를 제외 할 수 있습니다 .

당신이 제외한 모든 것을 보관 /usr하려면 다음을 사용할 수 있습니다.

tar -zcvf /all.tgz / --exclude=/usr

귀하의 경우 아마도

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir

17
명확히하기 위해 --exclude에 전체 경로를 사용할 수 있습니다.
Johan Soderberg 2016 년

2
어떤 경우에는 아카이브 할 파일 / 폴더 앞에 --exclude를 지정해야합니다.
kronuus

68

tar를 사용하여 백업에서 파일 / 디렉토리를 제외 할 수있는 옵션 :

여러 패턴을 사용하여 파일 제외

tar -czf backup.tar.gz --exclude=PATTERN1 --exclude=PATTERN2 ... /path/to/backup

패턴 목록으로 채워진 제외 파일을 사용하여 파일 제외

tar -czf backup.tar.gz -X /path/to/exclude.txt /path/to/backup

건너 뛸 디렉토리에 태그 파일을 배치하여 태그를 사용하여 파일을 제외하십시오.

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup

3
매개 변수의 순서가 중요 하고이 양식이 저에게 효과적입니다.
cstamas

1
나도. Ubuntu 16.04의 tar (GNU tar) 1.28의 경우이 특정 순서의 매개 변수 만 작동했습니다.
alvaroreig

43

많은 답변이있는 오래된 질문이지만, 나에게 충분히 명확한 것이 없다는 것을 알았으므로 시도를 추가하고 싶습니다.

다음 구조를 가지고 있다면

/home/ftp/mysite/

다음 파일 / 폴더 포함

/home/ftp/mysite/file1
/home/ftp/mysite/file2
/home/ftp/mysite/file3
/home/ftp/mysite/folder1
/home/ftp/mysite/folder2
/home/ftp/mysite/folder3

따라서 / home / ftp / mysite 내부에 모든 것을 포함하는 tar 파일을 만들고 싶지만 (사이트를 새 서버로 옮기기 위해) file3정크 파일이므로 모든 것이 folder3필요하지 않으므로 두 파일을 건너 뜁니다.

우리는 형식을 사용합니다

tar -czvf <name of tar file> <what to tar> <any excludes>

여기서 c = create, z = zip 및 v = verbose (입력 한 파일을 볼 수 있으며 제외하는 파일이 추가되지 않도록하는 데 유용함) 및 f = 파일.

그래서 내 명령은 다음과 같습니다

cd /home/ftp/
tar -czvf mysite.tar.gz mysite --exclude='file3' --exclude='folder3'

제외 된 파일 / 폴더는 상대적으로 tar의 루트에 있습니다 (여기서는 /와 관련하여 전체 경로를 시도했지만 그 작업을 수행 할 수는 없습니다).

이것이 누군가를 도울 수 있기를 바랍니다 (그리고 다음 번에 Google에서 할 때)


6
이 답변은 확실히 나를 도와 주었다! 나를위한 문제는 내 명령이와 같았 tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3'으며 아무것도 제외하지 않았다는 것입니다.
Anish Ramaswamy

2
귀하의 샘플은 내가 문제를 겪었던 것과 매우 유사했습니다! 감사합니다!
Qorbani

2
친절하고 감사합니다. 나에게 문제는 다른 대답에는 상대 경로의 절대가 포함된다는 것입니다. 그러나 제외하려는 폴더의 이름을 추가하기 만하면됩니다.
휴 버트

2
이것은 훨씬 더 명확한 대답입니다. 예제로 인해 처음에는 경로가 혼란 스러울 때 작동하도록 할 수있었습니다. 무리 감사!
fagiani

2
효과가 있었다! 제외에 슬래시를 추가하지 마십시오. 예를 들어, "file3"또는 "file3 / subfolder"가 작동하지만 "file3 /"및 "file3 / subfolder /"는 작동하지 않습니다!
lucaferrario

24

표준 "ant notation"을 사용하여 상대 디렉토리를 제외 할 수 있습니다.
이것은 저에게 효과적이며 .git 또는 node_module 디렉토리를 제외합니다.

tar -cvf myFile.tar --exclude=**/.git/* --exclude=**/node_modules/*  -T /data/txt/myInputFile.txt 2> /data/txt/myTarLogFile.txt

myInputFile.txt는 다음을 포함합니다 :

/ dev2 / java
/ dev2 / javascript


4
Bash 쉘 옵션 변수 globstar를 활성화 해야한다고 생각합니다 . 로 확인하십시오 shopt -s globstar. 나는 대부분의 유닉스 기반 OS에서 기본적으로 꺼져 있다고 생각합니다 . Bash 매뉴얼에서 : " globstar : 설정 **하면 파일 이름 확장 컨텍스트에 사용 된 패턴 이 모든 파일과 0 개 이상의 디렉토리 및 서브 디렉토리와 일치합니다. 패턴 뒤에 '/'가 있으면 디렉토리 및 서브 디렉토리 만 일치합니다. "
not2qubit

15

나는 적어도 Cygwin 에서 그것을 경험했습니다. 버전의 tar에서 나는 ( "CYGWIN_NT-5.1 1.7.17 (0.262 / 5 / 3) 2012-10-19 14:39 i686 Cygwin"을 Windows XP Home Edition에서 사용하고 있습니다. 옵션 순서는 중요합니다.

이 건설이 나를 위해 일하는 동안 :

tar cfvz target.tgz --exclude='<dir1>' --exclude='<dir2>' target_dir

그 하나 작동 하지 않았다 :

tar cfvz --exclude='<dir1>' --exclude='<dir2>' target.tgz target_dir

이것은 tar --help다음 을 밝힙니다.

tar [OPTION...] [FILE]

따라서 두 번째 명령도 작동해야하지만 분명히 그렇지는 않습니다 ...

최고의 rgds,


5
제외 할 디렉토리에 최종 백 슬래시가 포함되어서는 안된다는 점을 유의하여 위의 내용을 추가하십시오. 따라서 --exclude = '/ path / to / exclude / dir'CORRECT 이며 --exclude = '/ path / to / exclude / dir /'WRONG 입니다.
GeertVc

17
이것은 target archive target.tgz가 f 스위치의 인수이기 때문입니다.
Valentino

14

이 제외 패턴은 png 또는 mp3와 같은 파일 이름 접미사와 .git 및 node_modules와 같은 디렉토리 이름을 처리합니다.

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}

고마워-그게 내가 찾던거야 :)
Alexander Br.

11

문제가있는 사람들의 경우 일부 tar 버전은 제외 값에 './'가 없으면 제대로 작동합니다.

Tar --version

타르 (GNU tar) 1.27.1

작동하는 명령 구문 :

tar -czvf ../allfiles-butsome.tar.gz * --exclude=acme/foo

이들은 작동하지 않습니다 :

$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=./acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='./acme/foo'
$ tar --exclude=./acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='./acme/foo' -czvf ../allfiles-butsome.tar.gz *
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=/full/path/acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='/full/path/acme/foo'
$ tar --exclude=/full/path/acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='/full/path/acme/foo' -czvf ../allfiles-butsome.tar.gz *

10

나는 이것을 다른 곳에서 찾았으므로 신용을 얻지 못하지만 맥과 관련된 문제에 대해 위의 솔루션보다 더 효과적이었습니다 (이것이 닫혀 있어도).

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>

2
이 답변에 감사드립니다. darwin의 tar는 분명히 다른 구문을 가지고 있으며 다른 답변에서 "--exclude = blah"가 작동하지 않는 이유를 알 수 없었습니다. 이것은 Mac에서 훌륭하게 작동했습니다.
Michael

1
COPYFILE_DISABLE=1tar를 사용할 때 잊지 마세요 . 그렇지 않으면 tarball에 ._ 파일이있을 수 있습니다.
Benoit Duffez 2016 년

답변을 포함 해 주셔서 감사합니다. 답변을 찾은 소스에 대한 링크를 포함하는 것이 좋습니다. 보너스 : 소스가 다른 스택 오버 플로우 또는 스택 교환 게시물에서 온 경우 추가 카르마를 얻습니다 (포인트 또는 배지-어느 것을 기억하지 못합니다). 어느 쪽이든, 그들은 미소를 지으며 모두가 이깁니다. 단점은 없습니다 :-) 또한 추가 정보를 검색하려는 사람들에게 도움이됩니다. 때로는 소스 링크를 포함시켜 사람들이 공감할 때가 있습니다. 마지막으로,이 문제가 해결 된 특정 문제 또는 이것이 더 나은 솔루션 인 이유를 공유하면 다른 사람이 고유 한 문제를 겪을 수 있습니다.
SherylHohman

8

Mac OSX의 경우해야 할 일

tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar

-f이후에 유의하십시오--exclude=


6

--exclude 플래그가 올바른 접근법이라는 데 동의합니다.

$ tar --exclude='./folder_or_file' --exclude='file_pattern' --exclude='fileA'

내가 즉시 알지 못하는 부작용에 대한 경고 단어 :이 예제에서 'fileA'를 제외하면 'fileA'를 검색 할 것입니다 !

예 : 동일한 이름의 파일 (data.txt)을 포함하는 단일 서브 디렉토리가있는 디렉토리

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • --exclude='data.txt'아카이브를 사용 하는 경우 EITHER data.txt 파일이 포함되지 않습니다 . node_modules 디렉토리와 같은 써드 파티 라이브러리를 아카이브하는 경우 예기치 않은 결과가 발생할 수 있습니다.

  • 이 문제를 피하려면 다음과 같이 전체 경로를 제공하십시오 --exclude='./dirA/data.txt'


5

가능한 한 방지하기 'xargs: Argument list too long'때문에 사용에 오류가 find ... | xargs ...수십, 당신은 파이프의 출력 할 수있는 파일의 수천 처리 할 때 find직접 tar사용하여 find ... -print0 | tar --null ....

# archive a given directory, but exclude various files & directories 
# specified by their full file paths
find "$(pwd -P)" -type d \( -path '/path/to/dir1' -or -path '/path/to/dir2' \) -prune \
   -or -not \( -path '/path/to/file1' -or -path '/path/to/file2' \) -print0 | 
   gnutar --null --no-recursion -czf archive.tar.gz --files-from -
   #bsdtar --null -n -czf archive.tar.gz -T -

다음과 같이 'exclude'문자열을 인용 할 수 있습니다 : 'somedir / filesdir / *'그러면 쉘은 별표와 다른 흰색 문자를 확장하지 않습니다.
Znik

xargs -n 1xargs: Argument list too long오류 를 피하는 또 다른 옵션입니다 ;)
Tuxdude

5

이 스레드를 읽은 후 RHEL 5에서 약간의 테스트를 수행했으며 다음은 abc 디렉토리를 압축 해제 한 결과입니다.

디렉토리 오류와 로그 및 디렉토리 아래의 모든 파일이 제외됩니다.

tar cvpzf abc.tgz abc/ --exclude='abc/error' --exclude='abc/logs'

제외 된 디렉토리 뒤에 와일드 카드를 추가하면 파일이 제외되지만 디렉토리는 보존됩니다.

tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'

위의 두 번째 예에서는 각 exclude 절에서 마지막 슬래시 뒤에 별표가 있어야하지만 게시물에서는이를 표시하지 않았습니다.
Mike

4

tar 추가 (-r) 옵션과 함께 find 명령을 사용하십시오. 이렇게하면 2 단계 솔루션 (파일 목록 작성, tar 작성) 대신 단일 단계에서 기존 tar에 파일을 추가 할 수 있습니다.

find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;

4

필요에 따라 "--exclude-tag"옵션 중 하나를 사용할 수도 있습니다.

  • --exclude-tag = FILE
  • --exclude-tag-all = FILE
  • --exclude-tag-under = FILE

지정된 FILE을 호스팅하는 폴더는 제외됩니다.


4

다른 버전에 대한이 모든 좋은 대답을 읽고 스스로 문제를 해결 한 후에 는 매우 중요하고 GNU / Linux 일반 사용에는 드문 세부 사항이 있다고 생각 합니다. 에는 되지 않는 합니다.

따라서 모든 경우에 대한 질문에 대답하려고하지 않고 대신 작동하지 않을 위치를 등록하려고합니다 .

통지에 매우 중요합니다 :

  1. 옵션 사항의 순서 : 파일 옵션과 백업 할 디렉토리 다음에 --exclude를 넣는 것과 동일하지 않습니다. 내 경험상 GNU / Linux 명령에서 일반적으로 옵션의 순서는 중요하지 않기 때문에 이것은 나에게 예기치 않은 일입니다.
  2. 다른 tar 버전은이 옵션을 다른 순서로 예상합니다. 예 를 들어, 앤드류의 대답 @ GNU 타르 V에서 1.26 및 1.28 제외, 내 경우 반면에, 마지막으로 오는 GNU 타르 1.29로, 그것은 다른 방법을 나타냅니다.
  3. 트레일 링 슬래시 문제 : 적어도 GNU tar 1.29에서는 아무 것도 없어야합니다 .

필자의 경우 데비안 스트레치에서 GNU tar 1.29의 경우 작동하는 명령은 다음과 같습니다.

tar --exclude="/home/user/.config/chromium" --exclude="/home/user/.cache" -cf file.tar  /dir1/ /home/ /dir3/

따옴표는 중요하지 않았습니다.

나는 이것이 누군가에게 도움이되기를 바랍니다.


답변 주셔서 감사합니다. 나는 해결책을 찾고 (매우 오랜 시간을 느꼈다), 당신의 대답이 올바른 방향으로 나를 안내했습니다. 그러나 필자의 경우 (Ubuntu 18.04.3, Tar 1.29) 경로가 아닌 폴더 이름을 추가하는 것만으로 만들 수 있습니다 (예 : tar --exclude = folder1 --exclude = folder2 -czvf / opt / archieve). tgz 폴더
Nitai

2

cpio (1)를 사용하여 tar 파일을 만들 수 있습니다. cpio는 파일을 stdin에 아카이브하기 때문에 아카이브 파일을 선택하는 데 사용하려는 find 명령을 이미 알아 낸 경우 cpio로 파이프하여 tar 파일을 작성하십시오.

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz

2

gnu tar v 1.26 --exclude는 아카이브 파일 및 백업 디렉토리 인수 뒤에 와야하며 선행 또는 후행 슬래시가 없어야하며 따옴표 (단일 또는 이중)를 선호하지 않습니다. 따라서 백업 할 PARENT 디렉토리와 관련하여 다음과 같습니다.

tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude


많은 실험을 마치고에의 명령으로 거의 같은 것을 발견했습니다 tar (GNU tar) 1.28.
PicoutputCls

2
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

-X는 백업에서 제외해야하는 파일 이름 목록이 포함 된 파일을 나타냅니다. 인스턴스의 경우 백업에서 ~로 끝나는 파일 이름을 포함하지 않도록이 파일에서 * ~를 지정할 수 있습니다.


이 경우에도 작동하기 때문에 제외 수가 많을 때 이것이 최선의 해결책이라고 생각합니다. 옵션 팩에 X 옵션을 포함시킬 수도 있으므로 가장 짧은 형식은 다음과 같습니다.tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Kai Petzke

0

가장 좋은 방법은 xargs를 통해 tar로 find를 사용하는 것입니다 (많은 수의 인수를 처리하기 위해). 예를 들면 다음과 같습니다.

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2

4
이로 인해 tar가 여러 번 호출 될 수 있으며 파일을 반복적으로 압축합니다. 수정은 다음과 같습니다find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
조 젠슨

어딘가 에서을 xargs사용할 때 실제로 많은로드 결과를 찾을 때 xargs가 해당 결과 (로컬 명령 줄 인수 제한에 따라)를 청크로 분할하고 각 부분에서 tar를 호출 하기 때문에 r대신 tar 옵션을 사용해야 한다는 것을 읽었습니다 . 이로 인해 명령에 의해 발견 된 모든 결과가 아니라 마지막으로 청크가 반환 된 아카이브가 생성됩니다 . cfindxargsfind
Stphane

0

가능한 중복 답변이지만 유용하다는 것을 알았으므로 여기에 있습니다.

FreeBSD 루트 동안 (즉, csh 사용) 전체 루트 파일 시스템을 / mnt에 복사하지만 / usr 및 (분명히) / mnt없이 복사하고 싶었습니다. 이것이 효과가 있습니다 (/에 있습니다).

tar --exclude ./usr --exclude ./mnt --create --file - . (cd /mnt && tar xvd -)

내 요점은 ( ./ 을 넣어 ) 지정해야 한다는 것입니다. 더 큰 디렉토리의 일부가 복사되는 제외 된 디렉토리를 tar .

내 € 0.02


0

나는 tar가 5 기가 바이트의 하위 디렉토리를 몇 레벨 깊이 제외하는 것을 운이 없었습니다. 결국 유닉스 Zip 명령을 사용했습니다. 그것은 나를 위해 훨씬 쉽게 일했습니다.

따라서 원래 게시물 의이 특정 예
(tar --exclude = '. / folder'--exclude = '. / upload / folder2'-zcvf /backup/filename.tgz)

이에 상응하는 내용은 다음과 같습니다.

zip -r /backup/filename.zip. -x 업로드 / 폴더 / ** \ * 업로드 / 폴더 2 / ** \ *

(참고 : 여기에 내가 원래 /superuser/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t 도움이 된 게시물이 있습니다 )


3
zip빈 디렉토리를 압축 하지는 않지만 주의하십시오 tar!
t0r0X 2018 년

0

확인 해봐

tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName

0

localhost에 새로운 프론트 엔드 버전 (각도 폴더)을 갖고 싶습니다. 또한 내 경우에는 git 폴더가 크므로 제외하고 싶습니다. 응용 프로그램을 실행하려면 서버에서 다운로드하고 압축을 풀어야합니다.

/ var / lib / tomcat7 / webapps에서 각도 폴더를 압축하고 angular.23.12.19.tar.gz라는 이름의 / tmp 폴더로 옮깁니다.

사령부 :

tar --exclude='.git' -zcvf /tmp/angular.23.12.19.tar.gz /var/lib/tomcat7/webapps/angular/

0

성공 사례 : 1) 백업 할 전체 경로를 제공하는 경우 제외에도 전체 경로를 사용해야합니다.

tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / '--exclude = '/ opt / ABC / log / '/ opt / ABC

2) 백업 할 현재 경로를 제공하는 경우 제외시에도 현재 경로 만 사용해야합니다.

tar -zcvf backup_27032020.tar.gz --exclude = 'ABC / csv / '-- exclude = 'ABC / log / 'ABC

실패 사례 :

  1. currentpath 디렉토리에 백업을 수행하고 무시할 전체 경로를 지정하면 작동하지 않습니다.

    tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / '--exclude = '/ opt / ABC / log / 'ABC

참고 : 백업 전후 백업 제외를 언급하는 것이 좋습니다.


0

VCS (Version Control System) 파일을 제외하려는 경우 tar는 이미 두 가지 흥미로운 옵션을 지원합니다! :)

  1. 옵션 : --exclude-vcs

버전 관리 시스템에 따라 사용이 옵션 제외 파일 및 디렉토리 : CVS, RCS, SCCS, SVN, Arch, Bazaar, Mercurial,와 Darcs.

버전 1.32부터 다음 파일이 제외됩니다.

  • CVS/, 그 아래의 모든 것
  • RCS/, 그 아래의 모든 것
  • SCCS/, 그 아래의 모든 것
  • .git/, 그 아래의 모든 것
  • .gitignore
  • .gitmodules
  • .gitattributes
  • .cvsignore
  • .svn/, 그 아래의 모든 것
  • .arch-ids/, 그 아래의 모든 것
  • {arch}/, 그 아래의 모든 것
  • =RELEASE-ID
  • =meta-update
  • =update
  • .bzr
  • .bzrignore
  • .bzrtags
  • .hg
  • .hgignore
  • .hgrags
  • _darcs

    1. 옵션 : --exclude-vcs-ignores

일부 버전 제어 시스템 (VCS) 아래에 디렉토리를 아카이브 할 때,이 VCS '에서 제외 패턴을 읽을 종종 편리 파일 (예를 들어, 무시 .cvsignore, .gitignore등)이 옵션은 이러한 가능성을 제공합니다.

디렉토리를 보관하기 전에 다음 파일 중 하나가 포함되어있는 경우 참조 : cvsignore, .gitignore, .bzrignore, 또는 .hgignore. 그렇다면이 파일에서 무시 패턴을 읽으십시오.

패턴은 해당 VCS가 패턴을 처리하는 것처럼 처리됩니다.

.cvsignore

이 파일이있는 디렉토리에만 적용되는 쉘 스타일 글 로빙 패턴을 포함합니다. 파일에 주석이 허용되지 않습니다. 빈 줄은 무시됩니다.

.gitignore

쉘 스타일 글 로빙 패턴을 포함합니다. .gitfile위치한 디렉토리 와 모든 서브 디렉토리에 적용됩니다 .

a #로 시작하는 모든 줄 은 주석입니다. 백 슬래시는 주석 문자를 이스케이프합니다.

.bzrignore

쉘 글 로빙 패턴 및 정규 표현식을 포함합니다 (접두어가 RE:(16) 인 경우 패턴은 디렉토리 및 모든 서브 디렉토리에 영향을 미칩니다.

a #로 시작하는 모든 줄 은 주석입니다.

.hgignore

posix 정규 표현식 (17)을 포함합니다. 라인 syntax: glob이 쉘 글 로빙 패턴으로 전환됩니다. 회선이 syntax: regexp다시 전환됩니다. 주석은로 시작합니다 #. 패턴은 디렉토리와 모든 서브 디렉토리에 영향을줍니다.

tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/


-1

다음 bash 스크립트가 트릭을 수행해야합니다. 그것은 주어진 대답 사용 여기 마커스 Sundman으로합니다.

#!/bin/bash

echo -n "Please enter the name of the tar file you wish to create with out extension "
read nam

echo -n "Please enter the path to the directories to tar "
read pathin

echo tar -czvf $nam.tar.gz
excludes=`find $pathin -iname "*.CC" -exec echo "--exclude \'{}\'" \;|xargs`
echo $pathin

echo tar -czvf $nam.tar.gz $excludes $pathin

그러면 필요한 명령이 인쇄되고 다시 복사하여 붙여 넣을 수 있습니다. 명령 줄에 직접 제공하는 더 우아한 방법이있을 수 있습니다.

제외하려는 다른 일반 확장자, 파일 이름 또는 정규식에 대해 * .CC를 변경하면 여전히 작동합니다.

편집하다

약간의 설명 만 추가하면됩니다. find는 선택한 정규식 (이 경우 * .CC)과 일치하는 파일 목록을 생성합니다. 이 목록은 xargs를 통해 echo 명령으로 전달됩니다. 이것은 '목록에서 하나의 항목을 제외합니다'를 인쇄합니다. 슬래시 ()는 '표시의 이스케이프 문자입니다.


1
대화식 입력을 요구하는 것은 대부분의 쉘 스크립트에서 적합하지 않은 디자인 선택입니다. 대신 명령 행 매개 변수를 읽으면 쉘의 탭 완성, 히스토리 완료, 히스토리 편집 등의 이점을 얻을 수 있습니다.
tripleee

1
또한 공백 또는 셸 메타 문자가 포함 된 경로에는 스크립트가 작동하지 않습니다. 당신은해야 기본적으로 항상 특별히 공백 토큰 및 와일드 카드 확장을 수행하는 쉘을 필요로하지 않는 큰 따옴표로 변수를 넣어. 자세한 내용은 참조하십시오 stackoverflow.com/questions/10067266/...
tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.