検索を使用したスクリプトのクリーンアップ - そのファイルやディレクトリはありません。

検索を使用したスクリプトのクリーンアップ - そのファイルやディレクトリはありません。

次のコマンドを使用してサブボリュームセットを見つけて削除します。

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の専門家ではないので、これは少し混乱しています。なぜこれが起こるのですか?

ベストアンサー1

findが到着したら、/.snapshots/backup-24-11-2021の指示に従ってディレクトリであることを確認してください-type d。ディレクトリなので、指示に従ってくださいfind。完了すると、ディレクトリに到達したばかりで、そのディレクトリに戻ります。結局、ディレクトリへの再帰は.しかし、そのディレクトリはちょうど削除されました。したがって、問題を発見して報告してください。btrfs subvolume delete /.snapshots/backup-24-11-2021-exec …findfindbtrfs subvolume deletefind

find削除したいスナップショットの下で繰り返さないように指示します。これは通常、削除するディレクトリツリー全体を検索するために使用されます。

find /.snapshots/ -name 'backup-*' -type d -exec btrfs subvolume delete {} \; -prune

(注:句の周りに欠落している引用符も修正されました。引用-name符がないとbackup-*実行時に拡張されるため、現在のディレクトリに一致するファイルがある場合、または使用中のシェルにエラーがある場合、コマンドは操作を実行しません。グローバルに一致しませんとfind予想backup-*

しかし、実際にはこれは完全に間違ったコマンドかもしれません。find以下を見てください/.snapshots。たとえば、/.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-*

おすすめ記事