‘查找-mtime -1 -print |xargs tar’ 歸檔目錄中的所有文件,忽略 -mtime -1 參數
我正在嘗試創建一個備份腳本。我已經設法讓這個腳本在 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; }
我知道 using
tar 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 {} +