
/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
--parents
rmdir
ファイルまたはディレクトリが削除されたかどうかにかかわらず、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
です。その後、ディレクトリと空でないディレクトリのみを調べて、元の空のディレクトリが削除されるのを防ぎます。-depth
find
find