Tar
將 tar 提取到一個目錄,刪除它包含的所有文件,這些文件不存在於存檔中
假設我有一個大焦油,我會定期將其內容提取到一個固定位置。
我想將此位置保留為提取的 tar 的原始實例,並且我可以避免總是擦除輸出目錄的非常浪費的過程,只是為了通過使用
--keep-newer-files
標誌可能對 tar 進行的微小更改來更新它。但是,如果從輸出位置刪除存檔中不再存在的文件,我該怎麼辦?
標準
tar
命令可以列出存檔的內容。其縮寫形式是tar -tf archive.tar
.通過將其與 、 和命令替換一起使用
find
,grep
您將獲得以下內容:rm -f $(find . -d | head -n -1 | grep -Fv "$(tar -tf archive.tar)")
在您想要存檔內容的目錄中執行它,並替換
archive.tar
為存檔文件的路徑。從右到左為最外層命令替換內的管道工作:
find . -d
:列出目前目錄下的所有文件和目錄,按深度優先順序列出。深度優先排序在這裡很重要,因為我們計劃使用此文件列表進行刪除,因此必須在刪除目錄本身之前刪除目錄內容。head -n -1``find
: 從命令中排除最後一行。這將刪除/path
自己的條目,該條目可能存在也可能不存在於存檔中。如果我們不以深度優先的順序做事,這將是tail -n -1
.grep -Fv "$(tar -tf archive.tar)"
: 將歸檔列表傳遞給 grep 命令,然後它將從返回的列表中過濾掉那些行find
,因此只有不在歸檔中的文件才會傳遞給外部rm
命令。幾點注意事項:
- 這可能不太符合 POSIX。它應該在 GNU bash 中工作。
- 這取決於 tar 報告存檔內容的方式以及存檔的創建方式。特別是,列表必須與
find
報告的方式相匹配。使用 GNU tar 和大多數檔案,它應該可以工作。如果它不適合您的情況,您可以通過使用sed
或awk
在最裡面的命令替換中的 tar 命令的輸出上使用它來使其工作。- 在將其用於生產數據之前,請確保並對其進行測試,如果由於上述兩個原因中的任何一個都無法正常工作,則可能會從您執行它的目錄中刪除所有內容。