Bash

帶有 find 的清理腳本 - 沒有這樣的文件或目錄

  • November 25, 2021

我正在使用以下內容來查找和刪除一組子卷:

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,您的命令會指示findcall btrfs 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-*

引用自:https://unix.stackexchange.com/questions/679090