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 つの要素 (ファイル/ディレクトリ/リンクなど) も新しいものではないことがわかり、したがってこのディレクトリは削除しても安全です。