web-dev-qa-db-ja.com

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

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を削除しないコマンドが必要です

5

問題は、rmコマンドに-rオプションを追加したことです。これにより、フォルダが空でなくても削除されます。

これは2つのステップで行う必要があります。

  1. 古いファイルのみを削除します:

    find . -type f -mtime +31 -delete

  2. 古いフォルダを削除するには、それらが空の場合、ピーク here を使用して少し調整します。

    find . -type d -empty -mtime +31 -delete

3
Guilherme Costa
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
' {} {} \;

現在のディレクトリからfindを起動し、過去31日間に更新されていないdirectoriesのみを確認します。そして、これらの各ディレクトリで、31日以内のものを探し、ダミー文字をエコーし​​、前方検索を削除します(理想的には、ここで検索を終了する必要があります。 -quitしかし、それはPOSIXではないので、-Prune)。

次に、このfind操作の結果を探します。空であることが判明した場合、1つの要素(file/dir/link /etc。)でさえ新しいものではなく、したがってこのdirであることがわかります。削除しても安全です。

0
user218374