linux - tar排除 - Shell命令將tar目錄排除在某些文件/文件夾之外
tar exclude用法 (16)
是否有一個簡單的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 .
gnu tar v 1.26 --exclude需要在歸檔文件和備份目錄參數之後出現,不應該有前導或後綴斜杠,並且不要使用引號(單或雙)。 所以相對於要備份的PARENT目錄,它是:
tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude
一探究竟
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表示一個文件,其中包含必須從備份中排除的文件名列表。 對於實例,您可以在此文件中指定*〜,以避免在備份中包含以〜結尾的文件名。