문제

특정 파일/폴더가 보관되지 않도록 지원하는 간단한 쉘 명령/스크립트가 있습니까?

백업 할 필요가없는 매우 큰 파일이있는 서브 디렉토리와 함께 보관 해야하는 디렉토리가 있습니다.

확실한 솔루션 :

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

Find 명령을 사용하여 파일 목록을 작성하고 파일 목록을 생성하고 아카이브를 원하지 않고 목록을 TAR로 전달할 수 있지만 소량의 파일에 대해서만 작동합니다. 나는 수만 명이 있습니다.

유일한 솔루션은 제외 할 파일/폴더 목록이있는 파일을 작성한 다음 rsync를 사용하는 것입니다. --exclude-from=file 모든 파일을 TMP 디렉토리에 복사 한 다음 TAR을 사용하여 해당 디렉토리를 보관하십시오.

누구든지 더 나은/더 효율적인 솔루션을 생각할 수 있습니까?

편집하다: 찰스 마솔루션의 솔루션이 잘 작동합니다. 큰 gotcha는 그게입니다 --exclude='./folder' 해야 하다 TAR 명령의 시작 부분에 있습니다. Full Command (CD First, 백업은 해당 디렉토리와 관련이 있음) :

cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
도움이 되었습니까?

해결책

TAR에 대한 여러 배제 옵션을 가질 수 있습니다

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

등이 작동합니다. 만들다 확실한 놓다 --exclude ~ 전에 소스 및 목적지 항목.

다른 팁

디렉토리를 제외 할 수 있습니다 --exclude 타르 용.

제외한 모든 것을 보관하고 싶다면 /usr 당신이 사용할 수있는:

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

당신의 경우 아마도 같은 것입니다

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

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

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

다음 구조가있는 경우

/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

따라서 내부/홈/ftp/mysite 내부를 포함하는 TAR 파일을 만들고 싶습니다 (사이트를 새 서버로 옮기기 위해). file3 단지 쓰레기와 모든 것이 들어 있습니다 folder3 또한 필요하지 않으므로이 두 가지를 건너 뛸 것입니다.

우리는 형식을 사용합니다

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

c = c = create, z = zip 및 v = verbose (파일을 입력 할 때 파일을 볼 수 있습니다. 제외한 파일이 추가되지 않도록 유용합니다). 그리고 f = 파일.

그래서 내 명령은 이렇게 보일 것입니다

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

제외 된 파일 / 폴더는 타르의 루트에 상대적으로 적용됩니다 (나는 여기에서 전체 경로를 시도했지만 그 일을 할 수는 없습니다).

이것이 누군가가 도움이되기를 바랍니다 (그리고 다음에 나는 Google을 Google에 할 때)

표준 "개미 표기법"을 사용하여 디렉토리 상대를 제외 할 수 있습니다.
이것은 나에게 효과적이며 .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

나는 적어도 그것을 경험했다 Cygwin TAR의 버전 ( "Cygwin_NT-5.1 1.7.17 (0.262/5/3) 2012-10-19 14:39 I686 Windows XP 홈 에디션 SP3 시스템에서 Cygwin") 옵션 순서가 중요합니다.

이 건축은 저에게 효과가 있었지만

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]

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

최고의 RGD,

이것은 PNG 또는 MP3와 같은 파일 이름 접미사와 .git 및 node_modules와 같은 디렉토리 이름을 제외합니다.

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

나는 이것을 다른 곳에서 발견했기 때문에 신용을 얻지 못하지만 MAC 특정 문제에 대한 위의 어떤 솔루션보다 더 잘 작동했습니다 (폐쇄 되었음에도 불구하고).

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

문제가있는 사람들의 경우 일부 버전의 TAR는 제외 값에서 './'없이만 제대로 작동합니다.

Tar --version

타르 (GNU 타르) 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 *

Mac OSX의 경우해야했습니다

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

참고 -f--exclude=

나는 -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' 아카이브에는 포함되지 않습니다 어느 하나 data.txt 파일. Node_Modules 디렉토리와 같은 타사 라이브러리를 보관하는 경우 예기치 않은 결과가 발생할 수 있습니다.

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

가능하지 않습니다 '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 -

이 스레드를 읽은 후, 나는 Rhel 5에서 약간의 테스트를 수행했으며 ABC 디렉토리를 tarring에 대한 결과는 다음과 같습니다.

디렉토리 오류 및 로그 및 디렉토리의 모든 파일을 제외합니다.

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

제외 된 디렉토리 후 와일드 카드 추가는 파일을 제외하지만 디렉토리를 보존합니다.

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

TAR Append (-R) 옵션과 함께 찾기 명령을 사용하십시오. 이렇게하면 두 개의 패스 솔루션 (파일 목록 작성, 타르 생성) 대신 단일 단계에서 기존 타르에 파일을 추가 할 수 있습니다.

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

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

  • -exclude-tag = 파일입니다
  • -exclude-tag-all = 파일
  • -exclude-tag-under = 파일

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

CPIO (1)를 사용하여 TAR 파일을 만들 수 있습니다. CPIO는 파일을 STDIN에서 아카이브로 가져 오므로 이미 파일을 선택하는 데 사용하려는 명령을 찾은 경우 Archive를 선택하고 CPIO로 파이프로 파일을 생성합니다.

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

GNU Tar v 1.26 아카이브 파일 및 백업 디렉토리 인수 다음에 제공되어야하며 선행 또는 후행 슬래시가 없어야하며 인용문 (단일 또는 이중)을 선호하지 않아야합니다. 따라서 백업 할 부모 디렉토리와 관련하여 다음과 같습니다.

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

다른 버전에 대한이 좋은 답변을 모두 읽고 나 자신의 문제를 해결 한 후 매우 중요한 세부 사항이 매우 중요하며 GNU/Linux 일반 사용에 드물게 있습니다., 그것은 충분히 스트레스를받지 않고 의견보다 더 가치가 있습니다.

그래서 나는 모든 경우에 대한 질문에 대답하려고하지 않을 것이지만 대신 등록을 시도하십시오. 볼 수있는 곳 일이 작동하지 않을 때.

주목하는 것이 매우 중요합니다.

  1. 옵션의 순서가 중요합니다. 파일 옵션 이후보다 전기와 백업 디렉토리보다 이전보다 exclude를 동일하지 않습니다. 내 경험에서 GNU/Linux 명령에서 일반적으로 옵션 순서는 중요하지 않기 때문에 이것은 적어도 예상치 못한 일입니다.
  2. 다른 TAR 버전은이 옵션을 다른 순서로 기대합니다. 예를 들어, @Andrew의 대답 GNU Tar v 1.26 및 1.28에서 제외는 마지막으로 오는 반면, 내 경우 GNU Tar 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/

인용문은 중요하지 않았으며, 그들과 함께 있거나없이 작동했습니다.

나는 이것이 누군가에게 유용하기를 바랍니다.

가장 좋은 방법은 Xargs를 통해 타르와 함께 찾은 것입니다 (많은 수의 인수를 처리하기 위해). 예를 들어:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

-x는 백업에서 제외 해야하는 파일 이름 목록이 포함 된 파일을 나타냅니다. 예를 들어,이 파일에 *~를 지정하여 백업에 ~로 끝나는 파일 이름을 포함하지 않도록 할 수 있습니다.

가능한 중복 답변이지만 유용하다고 생각하기 때문에 여기에 있습니다.

freebsd 루트 (즉, CSH를 사용하는)이지만 전체 루트 파일 시스템을 /mnt로 복사하고 /usr 및 (명백히) /mnt없이 복사하고 싶었습니다. 이것이 효과가있는 것입니다 (나는 /) :

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

나의 요점은 그것이 필요하다는 것입니다 ( ./) 에게 지정하십시오 TAR는 더 큰 디렉토리의 일부가 복사되는 배제 된 디렉토리입니다.

내 € 0.02

나는 5 기가 바이트 하위 디렉토리를 몇 레벨 깊이로 배제하기 위해 타르를 얻는 운이 없었습니다. 결국, 나는 방금 Unix Zip 명령을 사용했습니다. 그것은 나를 위해 훨씬 더 쉽게 작동했습니다.

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

동등한 것은 다음과 같습니다.

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

(참고 : 여기에 내가 원래 사용한 게시물이 있습니다. https://superuser.com/questions/312301/unix-zip-directory-but-excluded-pecific-subdirectories and-every-within-t)

확인 해봐

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

다음 Bash 스크립트는 트릭을 수행해야합니다. 주어진 답을 사용합니다 여기 Marcus 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를 변경하면 여전히 작동해야합니다.

편집하다

약간의 설명을 추가하기 위해; 찾기 선택한 regex와 일치하는 파일 목록을 생성합니다 (이 경우 *.cc). 이 목록은 Xargs를 통해 Echo 명령으로 전달됩니다. 이 인쇄물은 '목록에서 하나의 항목'을 발표합니다. 슬래시 ()는 '마크의 탈출 문자입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top