升級到 Debian 伸展後,Tar 排除列表不再起作用
我很久以前寫了一個備份腳本,它使用了 tar 手冊的這一部分:
您可以提供多個 `–exclude’ 選項。
--exclude-from=file
-X file
導致 tar 忽略與文件中列出的模式匹配的文件。
我的 tar 命令如下:
includesFile=include.txt excludesFile=exclude.txt tar zcpf - . -T ${includesFile} -X ${excludesFile} | openssl des3 -salt | dd of=out.bak
這是
include.txt
:/etc/ /var/ /usr/ /data/ /opt/ /root
這是
exclude.txt
/data/webapp/webapp-data/* /var/cache/* /var/lib/dpkg/* /usr/bin/* /usr/share/locale/*
它曾經工作得很好。最近我注意到存檔的大小顯著增加,通過切換到詳細
tar
讓我看到它包含了webapp-data
巨大的目錄。由於某種原因,它不再被排除在外。我做的最後一件事是從Debian Jessie升級到Debian Stretch。版本變化很小,不知道是不是這個原因。
我嘗試更改
/data/webapp/webapp-data/*
為/data/webapp/webapp-data/**
,但這沒有幫助。為什麼排除列表不再起作用?
我(終於)找到了問題並能夠解決它。它是多種事物的組合,包括
excludes
作為萬用字元給出的事物(在提出問題之前我沒有這樣做……現在這不再起作用了)。這是有效的命令:includesFile=include.txt excludesFile=exclude.txt tar -zcpf - --absolute-names -X ${excludesFile} -T ${includesFile} | openssl des3 -salt | dd of=out.bak
當然,排除以這種形式給出:
/var/cache/* /var/lib/dpkg/* /usr/bin/* /usr/share/locale/* /proc/* /sys/*
並包括:
/etc/ /var/ /usr/
從 Debian Jessie 升級到 Stretch 後,我在 tar 排除方面遇到了同樣的問題,我只需將命令行參數順序
從: 更改
tar cvzpf backup.tar.gz /DirToBackup1 /DirToBackup2 --exclude-from=/path/to/backup_exclude.txt
為:
tar cvzpf backup.tar.gz --exclude-from=/path/to/backup_exclude.txt /DirToBackup1 /DirToBackup2
我的 backup_exclude.txt 看起來像這樣
/var/log/* /cache/* /.cache/*
(參考https://www.gnu.org/software/tar/manual/html_section/tar_49.html頁面末尾 )