linux - tar排除 - Shell命令將tar目錄排除在某些文件/文件夾之外




tar exclude用法 (16)

gnu tar v 1.26 --exclude需要在歸檔文件和備份目錄參數之後出現,不應該有前導或後綴斜杠,並且不要使用引號(單或雙)。 所以相對於要備份的PARENT目錄,它是:

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

是否有一個簡單的shell命令/腳本支持排除某些文件/文件夾的存檔?

我有一個目錄,需要用一個子目錄進行歸檔,這個目錄有很多我不需要備份的非常大的文件。

不完全解決方案:

tar --exclude=PATTERN命令匹配給定的模式並排除這些文件,但我需要特定的文件和文件夾被忽略(完整文件路徑),否則有效的文件可能被排除。

我也可以使用find命令來創建一個文件列表,並排除那些我不想存檔的文件,並將列表傳遞給tar,但只適用於少量文件。 我有成千上萬。

我開始認為唯一的解決方案是創建一個文件,列出要排除的文件/文件夾,然後使用rsync和--exclude-from=file將所有文件複製到tmp目錄,然後使用tar歸檔該目錄。

任何人都可以想到更好/更有效的解決方案嗎?

編輯: cma的解決方案效果很好。 大問題在於--exclude='./folder' 必須位於tar命令的開頭。 完整的命令(首先,CD,所以備份是相對於該目錄):

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

一探究竟

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

你可以有多個tar排除選項

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

等將工作。 確保在源項目和目標項目之前放置 - --exclude


你最好的選擇是通過xargs使用find和tar來處理大量的參數。 例如:

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

可能的冗餘答案,但因為我發現它很有用,它是這樣的:

雖然FreeBSD根目錄(即使用csh),但我想將我的整個根文件系統複製到/ mnt,但沒有/ usr和(顯然)/ mnt。 這是什麼工作(我在/):

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

我的觀點是,有必要(通過放置./指定將tar目錄中正在復制的更大目錄的部分排除在外的目錄。

我的€0.02


在閱讀完這篇文章之後,我對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/*'

對於Mac OSX我必須這樣做

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

注意--exclude=之後的-f


對於那些有問題的人來說,一些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 *

您可以使用--exclude排除tar目錄。

如果你想存檔除/usr以外的所有內容,你可以使用:

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

在你的情況下,可能類似

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

您可以使用cpio(1)創建tar文件。 cpio將這些文件存檔到stdin中,所以如果您已經找到了想要用來選擇文件存檔的find命令,請將其導入到cpio中以創建tar文件:

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

我同意--exclude標誌是正確的方法。

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

一個警告的一個副作用,我沒有立即發現顯而易見:在這個例子中排除'fileA'將搜索'fileA'RECURSIVELY

示例:具有包含同名文件(data.txt)的單個子目錄的目錄

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • 如果使用--exclude='data.txt' ,存檔將不包含任何data.txt文件。 如果歸檔第三方庫(如node_modules目錄),這可能會導致意外的結果。

  • 為了避免這個問題,請確保給出整個路徑,例如--exclude='./dirA/data.txt'


我沒有運氣獲得tar來排除幾個級別的5 GB子目錄。 最後,我只使用了unix Zip命令。 它對我來說工作起來更容易。

因此,來自原始帖子的這個特定例子
(tar --exclude ='。/文件夾'--exclude ='。/ upload / folder2'-zcvf /backup/filename.tgz。)

相當於:

zip -r /backup/filename.zip。 -x upload / folder / ** \ * upload / folder2 / ** \ *

(注意:這是我最初使用的幫助我的帖子https://superuser.com/questions/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t


我經歷過,至少在我使用的Cygwin版本的tar(“CYGWIN_NT-5.1 1.7.17(0.262 / 5/3)2012-10-19 14:39 i686 Cygwin”在Windows XP Home Edition上SP3機器),選項的順序很重要。

雖然這種構造對我有用:

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,


為了避免由於使用find ... | xargs ...引起的'xargs: Argument list too long'錯誤 find ... | xargs ...在處理數以萬計的文件時,可以使用find ... -print0 | tar --null ...的輸出直接傳輸到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 -

這個排除模式處理文件名後綴,如png或mp3以及目錄名稱,如.git和node_modules

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

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

-X表示一個文件,其中包含必須從備份中排除的文件名列表。 對於實例,您可以在此文件中指定*〜,以避免在備份中包含以〜結尾的文件名。





tar