
我需要在兩個 suse 伺服器之間複製資料庫日誌文件,我只對 2013 年 3 月 10 日至 2013 年 3 月 13 日之間的文件感興趣
需要在複製之前壓縮文件,因此我對它們進行 tar 和 scp。目前我正在使用tar -cvzf /tmp/saas_archive_logs.tar.gz /var/lib/edumate/backup/archive_logs/db2inst1/SAAS --newer-mtime=2013-03-10
它為我提供從 2013 年 3 月 10 日至今的所有文件。但我不需要全部。我沒有找到任何 tar 開關。
答案1
正如 Bichoy 所指出的,您可以使用該find
命令來尋找具有特定存取、建立和修改時間的檔案。然而 -mtime 以 24 小時為增量進行偏移,並且並不總是方便計算,除非您想要特定數量的「天」前的內容。您需要將其與-daystart
“四捨五入”合併到當天的開始時間。
我認為在您的情況下更方便的是 -newermt 選項,它採用日期字串(而不是像大多數 -newerXY 版本那樣的參考檔案的名稱)
find
將其與的-print0
選項結合起來處理名稱中帶有空格的文件,並且可以選擇-type f
在您感興趣的時間段內不獲取任何目錄:
find /var/lib/edumate/backup/archive_logs/db2inst1/SAAS \
-newermt 20130310 -not -newermt 20130314 -type f -print0 \
| xargs -0 tar -cvzf /tmp/saas_archive_logs.tar.gz
這有一個大問題:如果找到的檔案數量變得太長,將根據需要多次xargs
調用其命令(在本例中) ,以適應命令列上的參數,而命令列上的參數不是無限的。為了避免這種情況,我總是使用,它從標準輸入讀取檔案名稱。使用參數獲取 POSIX tar 文件,在您的情況下,您需要透過管道傳輸輸出以獲得所需的結果:tar
xargs
cpio
--format=ustar
gzip
find /var/lib/edumate/backup/archive_logs/db2inst1/SAAS \
-newermt 20130310 -not -newermt 20130314 -type f -print0 \
| cpio --create --null --format=ustar \
| gzip > /tmp/saas_archive_logs.tar.gz
答案2
您可以檢查該find
命令以獲取需要去皮的文件清單。您可以使用普通-atime
, -btime
, -mtime
... 參數與-not
參數組合來指定開始和結束日期(精確到秒)。然後,您可以將輸出透過管道傳輸到xargs
,然後再傳輸到tar
。find
有關時間參數的詳細信息,請查看 的手冊頁。
更新:
正如 Anthon 所建議的,您可以使用 +/- 修飾符來-mtime
指定週期,而不使用-not
。這是一個例子:
find . -mtime -5d2h3m10s -mtime +4d0h15m20s -print0 | xargs -0 tar cjvf mytar.tar.bz2
其中d, h, m, s
對應於天、小時、分鐘和秒分別。這將給出更新於5d2h3m10s
和舊於的文件4d0h15m20s