tar:如何在打包後刪除檔案但保留目錄

tar:如何在打包後刪除檔案但保留目錄

我想要tar打包一個完整的目錄

tar cvjf dir.tbz dir

但讓它刪除所有文件

tar cvjf dir.tbz dir --remove-files

然而,這也會刪除 ./dir 。所以我嘗試在打包之前進入目錄

tar cvjf dir.tbz --remove-files -C dir .

但這仍然刪除了 ./dir... 對我來說沒有任何意義,因為為什麼 tar 應該刪除工作目錄本身?難道我不能打包一個完整的目錄並在打包後刪除檔案而不刪除整個目錄嗎?

我有一個正在運行的進程,它不斷地在 ./dir 中創建文件,並希望每小時打包所有文件,然後刪除這些打包的文件。我可以在 tar 之後 mkdir 並刪除,但這可能會導致創建檔案的其他進程在 mkdir 重新建立目錄之前嘗試寫入新檔案時陷入困境。

答案1

你可以嘗試這樣的事情:

find dir -type f -mmin +1 | xargs -I{} sh -c 'tar rvf dir.tar {} && rm {}'
bzip2 dir.tar && mv dir.tar.bz2 dir-$(date +%F-%T).tbz

它比您當前的命令稍微複雜一些,但是可以工作,而且我不相信它有任何競爭問題(前提是文件沒有被多次寫入且間隔超過一分鐘)。

find命令查找dir其中至少一分鐘前的所有文件(因此當前未寫入)。然後將該清單透過管道傳輸到xargs,這將依次將每個清單新增至dir.tar檔案。將檔案成功新增至 tar 檔案後,原始檔案將被刪除。如果您有大量文件,一次執行一個操作可以避免命令列太長的問題。最後您可以壓縮並重命名 tar 檔案。

答案2

我現在的解決方法如下:

我編寫了一個腳本,將 cd 放入目錄並使用 ./* 壓縮內容,然後刪除。我只是希望 -C 能做同樣的事情,這樣我就可以在一個命令列中使用它,但事實並非如此。

#!/bin/bash

cd /path/to/dir
tar cvjf dir.tbz ./* --remove-files

應該管用。

相關內容