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

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

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

関連情報