31日以上更新されていないすべてのファイル、フォルダ、およびサブフォルダを削除するコマンドが必要です。私はこれを試しました
find . -mindepth 1 -mtime +31 -exec rm -rf "{}" \;
しかし、このような階層がある場合
.
├── old_sub_folder1
└── old_sub_folder2
├── old_file
└── old_sub_folder3
└── new_file
old_*
古いフォルダ\ファイルはどこにあり、new_file
新しいファイルはどこにありますか?
このコマンドはすべてを削除します。日付がold_sub_folder2
作成された後は更新されないためです。new_file
old_sub_folder2/old_sub_folder3/new_file を削除しないコマンドが必要です
答え1
問題は、コマンド-r
にオプションを追加することです。rm
フォルダが空でなくてもフォルダは削除されます。
これは2つのステップで行う必要があります。
削除のみ古いファイル:
find . -type f -mtime +31 -delete
古いフォルダを削除するには、そのフォルダが空の場合は、次の点を確認してください。ここ、少し調整します。
find . -type d -empty -mtime +31 -delete
答え2
find . -type d ! -name . -mtime +31 -exec sh -c '
case $(find "$1" ! -mtime +31 -exec echo x \; -prune) in
"" ) rm -rf "$1" || echo "Error could not delete folder \"$1\"" ;;
esac
' {} {} \;
現在のカタログで、過去31日以降に更新されていないカタログfind
のみを実行して表示します。directories
各ディレクトリで順番にドリルダウンして、31日より古いアイテムを見つけます。これを見つけると、ダミー文字をエコーし、すべての前方検索を切り取ります(理想的には検索を終了する必要があります)。-quit
ただし、これはPOSIX
許可されていません-prune
。
その後、この操作の結果を探してfind
結果が空の場合、1つの要素(ファイル/ディレクトリ/リンク/など)も新しいものではないため、このディレクトリであることがわかります。削除しても安全です。