Tar

tar –exclude 不排除。為什麼?

  • June 8, 2021

我在成功執行(即生成_data.tar文件)的 bash 腳本中有這個非常簡單的行,除了它--exclude排除通過選項告訴它排除的子目錄:

/bin/tar -cf /home/_data.tar  --exclude='/data/sub1/*'  --exclude='/data/sub2/*' --exclude='/data/sub3/*'  --exclude='/data/sub4/*'  --exclude='/data/sub5/*'  /data

相反,它會生成一個_data.tar文件,其中包含 /data 下的所有內容,包括我想要排除的子目錄中的文件。

知道為什麼嗎?以及如何解決這個問題?

更新我根據下面第一個答案中提供的連結實現了我的觀察(首先是頂級目錄,最後排除後沒有空格):

/bin/tar -cf /home/_data.tar  /data  --exclude='/data/sub1/*'  --exclude='/data/sub2/*'  --exclude='/data/sub3/*'  --exclude='/data/sub4/*'  --exclude='/data/sub5/*'

但這沒有幫助。_data.tar結果文件中存在所有“排除的”子目錄。

這令人費解。無論這是目前 tar 中的錯誤(GNU tar 1.23,在 CentOS 6.2、Linux 2.6.32 上)還是 tar 對空格和其他容易遺漏的錯字“極度敏感”,我都認為這是一個錯誤。目前。

這太可怕了:我嘗試了下面建議的見解(沒有尾隨/*),但它在生產腳本中仍然不起作用:

/bin/tar -cf /home/_data.tar  /data  --exclude='/data/sub1'  --exclude='/data/sub2'  --exclude='/data/sub3'  --exclude='/data/sub4'

我看不出我嘗試的和@Richard Perrin 嘗試的有什麼區別,除了引號和 2 個空格而不是 1。我要試試這個(必須等待夜間腳本作為要支持的目錄執行up 是巨大的)並報告回來。

/bin/tar -cf /home/_data.tar  /data --exclude=/data/sub1 --exclude=/data/sub2 --exclude=/data/sub3 --exclude=/data/sub4

我開始認為所有這些tar --exclude敏感性都不是焦油,而是我環境中的某種東西,但那會是什麼?

**有效!**嘗試的最後一個變體(沒有單引號和單空格,而不是 s 之間的雙空格--exclude)測試工作。奇怪但接受。

**逆天!事實證明,舊版本的tar(1.15.1) 只有在頂級目錄位於命令行的最後一個時才會排除。**這與 1.23 版的要求完全相反。供參考。

如果您想排除整個目錄,您的模式應該匹配該目錄,而不是其中的文件。使用--exclude=/data/sub1代替--exclude='/data/sub1/*'

小心引用模式以保護它們免受外殼擴展。

看這個例子,在最後的呼叫中遇到了麻煩:

$ for i in 0 1 2; do mkdir -p /tmp/data/sub$i; echo foo > /tmp/data/sub$i/foo; done
$ find /tmp/data
/tmp/data
/tmp/data/sub2
/tmp/data/sub2/foo
/tmp/data/sub0
/tmp/data/sub0/foo
/tmp/data/sub1
/tmp/data/sub1/foo
$ tar -zvcf /tmp/_data.tar /tmp/data --exclude='/tmp/data/sub[1-2]'
tar: Removing leading `/' from member names
/tmp/data/
/tmp/data/sub0/
/tmp/data/sub0/foo
$ tar -zvcf /tmp/_data.tar /tmp/data --exclude=/tmp/data/sub[1-2]
tar: Removing leading `/' from member names
/tmp/data/
/tmp/data/sub0/
/tmp/data/sub0/foo
$ echo tar -zvcf /tmp/_data.tar /tmp/data --exclude=/tmp/data/sub[1-2]
tar -zvcf /tmp/_data.tar /tmp/data --exclude=/tmp/data/sub[1-2]
$ tar -zvcf /tmp/_data.tar /tmp/data --exclude /tmp/data/sub[1-2]
tar: Removing leading `/' from member names
/tmp/data/
/tmp/data/sub2/
/tmp/data/sub2/foo
/tmp/data/sub0/
/tmp/data/sub0/foo
/tmp/data/sub2/
tar: Removing leading `/' from hard link targets
/tmp/data/sub2/foo
$ echo tar -zvcf /tmp/_data.tar /tmp/data --exclude /tmp/data/sub[1-2]
tar -zvcf /tmp/_data.tar /tmp/data --exclude /tmp/data/sub1 /tmp/data/sub2

可能是您的版本tar要求必須將--exclude選項放在tar命令的開頭。

請參閱:https ://stackoverflow.com/q/984204

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

見:http ://mandrivausers.org/index.php?/topic/8585-multiple-exclude-in-tar/

tar --exclude=<first> --exclude=<second> -cjf backupfile.bz2 /home/*

選擇:

EXCLD='first second third'
tar -X <(for i in ${EXCLD}; do echo $i; done) -cjf backupfile.bz2 /home/*

另一個tar命令提示來自這裡

tar cvfz myproject.tgz --exclude='path/dir_to_exclude1' \
                      --exclude='path/dir_to_exclude2' myproject

引用自:https://unix.stackexchange.com/questions/32845