一般化する

一般化する

/homeディレクトリで100 MBを超えるファイルを見つけ、10日を超えると削除する検索スクリプトがあります。 cron ジョブで毎日スケジュールされます。

find /home/ -mtime +10 -type f -size +100M -delete >/dev/null 2>&1

このスクリプトを使用すると空のディレクトリが残るので、ファイルが削除されたディレクトリを繰り返し削除したいと思います。

誰でもこのスクリプトにどのような変更が必要かを提案または提案できますか?

答え1

GNUシステムでは、次のことができます。

find /home/ -mtime +10 -type f -size +100M -delete -printf '%h\0' |
  awk -v RS='\0' '!seen[$0]++ {out = out $0 RS}
                  END {printf "%s", out}' |
  xargs -r0 rmdir

awk順序を維持しながら重複ファイルをフィルタリングし(そのファイルがある分岐の前に残す)、空のディレクトリを削除できるようrmdirに、すべてのファイルが削除されるまで印刷を遅らせました。

そしてzsh

files=(/home/**/*(D.LM+100m+10od))
rm -f $files
rmdir ${(u)files:h}

これにより、ディレクトリが削除され、空になります。文書ただし、このディレクトリの親ディレクトリには削除するファイルがなく、次のために空の場合は削除されません。目次削除されました。これらも削除するには、GNUを使用rmdirして。-p--parentsrmdir

ファイルまたはディレクトリが削除されたかどうかにかかわらず、GNUを使用して空のディレクトリをすべて削除するには、find次の手順を実行できます。

 find /home/ \( -mtime +10 -type f -size +100M -o -type d -empty \) -delete

答え2

以降の2回目の実行では、空のディレクトリをすべて削除できません(findオプション-empty-type d

答え3

cd "/home" && \
find . -depth -type d ! -name . ! -empty -exec sh -c '
   find "$1" -mtime +10 -type f -size +100M -delete
' {} {} \; -empty -delete

一般化する

上記の作業を行うにはGNU findが必要です。基本的なアイデアは、サブディレクトリが親ディレクトリの前に処理されるようにするパターンを使用することfindです。その後、ディレクトリと空でないディレクトリのみを調べて、元の空のディレクトリが削除されるのを防ぎます。-depthfindfind

関連情報