帶有 find 的清理腳本 - 沒有這樣的文件或目錄
我正在使用以下內容來查找和刪除一組子卷:
find /.snapshots/ -name backup-* -type d -exec btrfs subvolume delete {} \;
它有效,但我從 find 中得到了意外的輸出:
Delete subvolume (no-commit): '/.snapshots/backup-24-11-2021' find: ‘/.snapshots/backup-24-11-2021’: No such file or directory Delete subvolume (no-commit): '/.snapshots/backup-25-11-2021' find: ‘/.snapshots/backup-25-11-2021’: No such file or directory
我不是unix的專業人士,所以對我來說有點令人費解,為什麼會發生這種情況?
當
find
到達時/.snapshots/backup-24-11-2021
,它檢查它是否是一個目錄,如-type d
. 它是一個目錄,find
因此btrfs subvolume delete /.snapshots/backup-24-11-2021
按照-exec …
. 完成後,find
剛剛訪問了一個目錄,因此它遞歸到該目錄。畢竟,遞歸到目錄是find
. 但是該目錄剛剛被刪除(按btrfs subvolume delete
)。所以find
注意到有問題並報告它。告訴
find
不要在您要刪除的快照下遞歸。這通常適用於查找要刪除的整個目錄樹。find /.snapshots/ -name 'backup-*' -type d -exec btrfs subvolume delete {} \; -prune
(注意:我還修復了
-name
子句周圍缺少的引號。沒有引號,在執行backup-*
時會擴展find
,因此如果目前目錄有匹配的文件backup-*
,或者如果您使用的 shell 出錯,該命令將不會執行預期的操作在不匹配的球體上。)但實際上,這可能是完全錯誤的命令。您正在指示
find
在/.snapshots
. 例如,如果有一個 directory/.snapshots/saved-for-posterity/usr/src/backup-app
,您的命令會指示find
callbtrfs subvolume delete /.snapshots/saved-for-posterity/usr/src/backup-app
,這沒有意義。假設所有快照都是 的子目錄/.snapshots
,通過-maxdepth 1
以避免進一步遞歸:find /.snapshots/ -maxdepth 1 -name 'backup-*' -type d -exec btrfs subvolume delete {} \;
那和之間的唯一區別
btrfs subvolume delete /.snapshots/backup-*
如果目前沒有備份,這將
btrfs subvolume delete
使用文字參數呼叫。/.snapshots/backup-*