Debian

‘查找-mtime -1 -print |xargs tar’ 歸檔目錄中的所有文件,忽略 -mtime -1 參數

  • May 12, 2016

我正在嘗試創建一個備份腳本。我已經設法讓這個腳本在 CentOS 6.7 機器上正常工作,現在正試圖讓它在 Debian 7 上正常工作。

我遇到了一個問題,我似乎無法用 Google 或本網站上的任何資訊解決。在解決問題之前,我會嘗試解釋我的情況。

在 CentOS 上,我使用以下命令在過去 24 小時內查找已更改的文件,$SOURCEDIR並使用xargs僅將這些文件放入$ARCHIVE. 如果沒有找到文件,則會彈出一條消息。

find $SOURCEDIR -mtime -1 -print | xargs -r tar rcvf $ARCHIVE || { echo "No files have been changed in the past 24 hours. Exiting script ..." ; exit 1; }

我知道 usingtar rcvf可以呼叫以下錯誤消息:

您不能指定多個“-Acdtrux”或“–test-label”選項

然而,這似乎不會發生在 CentOS 機器上。它Debian 機器上執行,因此我r從命令中刪除了該tar命令。我首先添加它的原因是因為如果find返回超過 100 個結果,我想避免存檔被覆蓋。

*現在進入實際問題。*每當我跑步

find $SOURCEDIR -mtime -1 -print

$SOURCEDIR正如預期的那樣,我得到了過去 24 小時內已更改的文件的列表。但是,每當我執行包括管道符號和這樣的xargs命令的完整命令時:

find $SOURCEDIR -mtime -1 -print | xargs -r tar cvf $ARCHIVE || { echo "No files have been changed in the past 24 hours. Exiting script ..." ; exit 1; }

實際上,我看到find命令列印所有文件,$SOURCEDIR然後才得到一個包含所有文件的存檔$SOURCEDIR,我不明白為什麼。任何幫助將不勝感激。

正如其他人所指出的那樣,您的命令的問題在於它包含目錄,並且 tar 遞歸地歸檔它們。如果最近修改了一個目錄,則該目錄及其子目錄中的所有文件都將被包括在內,無論它們是否已被修改。

如果您不關心備份目錄元數據,那麼只需告訴find不要列印目錄名稱。省略根目錄是不夠的:同樣的事情也可能發生在子目錄中。

find "$SOURCEDIR" -mtime -1 ! -type d -print | xargs -r tar -rcf "$ARCHIVE"

使用 xargs失敗,文件名包含空格和一些其他特殊字元。這很容易解決:使用-exec而不是xargs.

find "$SOURCEDIR" -mtime -1 ! -type d -exec tar -rcf "$ARCHIVE" {} +

如果要備份目錄元數據,請find列印所有內容,而不是告訴tar不要遞歸到子目錄。既然find是做遞歸,tar就不需要了。

find "$SOURCEDIR" -mtime -1 -exec tar -rcf "$ARCHIVE" --no-recursion {} +

使用這種方法,您可以避免使用tar -rc並解決重複 tar 呼叫的問題,方法是首先創建一個僅包含根目錄的存檔,然後分批附加到它。(為什麼是根目錄?因為 GNU tar 害怕創建一個空存檔。)

tar -cf "$ARCHIVE" --no-recursion "$SOURCEDIR"
find "$SOURCEDIR" -mindepth 1 -mtime -1 -exec tar -rf "$ARCHIVE" --no-recursion {} +

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