古いファイル、フォルダ、サブフォルダをすべて削除するコマンド

古いファイル、フォルダ、サブフォルダをすべて削除するコマンド

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 つの手順で実行する必要があります。

  1. 削除する古いファイル:

    find . -type f -mtime +31 -delete

  2. 古いフォルダを削除するには、空の場合は覗いてみましょうここ少し調整してみましょう:

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

関連情報