我有一個備份命令,如下所示:
tar cvpzf /backup/incremental-$now.tar.gz --after-date='1 day ago' -C / etc/ home/ root/ --exclude-from=/root/exclusion_list.txt --warning=no-file-unchanged > /backup/log-$now.txt 2>&1
問題是它還包括空資料夾,其中的所有檔案都未更改,因此不包含在增量備份中。我正在尋找一種方法來避免這種情況,但我找到的唯一解決方案(將 find 的結果通過管道傳輸到 tar 作為 xargs 的參數)只適用於只有一個資料夾的情況,我有三個資料夾。
答案1
預設情況下,tar 不提供跳過空目錄的方法。話雖這麼說,憑空拉出一個簡單的 shell 腳本來完成需要做的事情並不是太多工作。
這裡是一個論壇討論,當需要出現時,我找到了完全相同問題的解決方案。
主要更新:首先,我需要為我的草率複製貼上鄭重道歉。這是一個深夜的帖子,我的智力還沒有達到頂峰......
正確的論壇貼文是這裡。事實上,同一個人在不同的論壇上問同樣的問題,卻得到了完全不同的答案。當我遇到問題時,我已經為這兩個問題添加了書籤,並給出了錯誤的連結。
實際上,這裡顯示的是將 find 命令的輸出「管道」到 tar 的方法。你必須忽略所有關於「比這個人問的新」的東西。
相反,您需要的查找部分是這樣的:
find . -type d ! -empty | ...
當然,您必須將點(“.”)替換為需要 find/tar 啟動的路徑。在管道之後,按照第二個連結(正確的連結)繼續使用 tar 指令。
如果我因為不注重細節而造成任何麻煩,我再次深表歉意。
答案2
僅當您僅更改一小部分文件時才有效的另一種方法是:
tar cvzf [...] `find . -mtime -1 -type f`
如果您有大量更改,您可以將更改的檔案清單轉儲到檔案中,並在 tar 命令上使用 --files-from 參數:
find . -mtime -1 -type f > /tmp/changed.txt
tar cvzf [...] --files-from=/tmp/changed.txt
或在一行中
find . -mtime -1 -type f | tar cvzf [...] --files-from=/dev/stdin