2週間以上前に最後に変更された非表示のファイルとディレクトリの両方を削除するには、次のようにします。
find ~ -mindepth 1 -mtime +14 -name "[!.]*" -delete
時々、「ディレクトリが空ではありません」というエラーメッセージが表示されます。
find
私はこれらのエラーを削除したいのですが(cronjobで実行するとエラーの通知を受け取るため)、ディレクトリが空で2週間以上経ってもエラーを削除したいと思います。
答え1
非標準拡張をfind
サポートしている-maxdepth
場合は、おそらくそれを行うことができます。-delete
-empty
find ~ -mindepth 1 -mtime +14 ! -name '.*' \( ! -type d -o -empty \) -delete
(つまり、空のディレクトリのみを削除しようとします)
これは、ファイルが含まれているディレクトリの前にファイルを削除したい場合を-delete
意味します。-depth
ただし、ディレクトリからファイルを削除すると、ディレクトリの変更時間が更新されます。つまり、ディレクトリに正常に削除された古いファイルが含まれている場合、そのファイル自体が元の古いファイルであっても削除されません。
ここではディレクトリを削除したくありません。
find ~ -mtime +14 ! -name '.*' ! -type d -delete
または、ファイルを削除する前に、以前のディレクトリのリストを記録し、ディレクトリ以外のファイルを削除してから、記録されたリストからディレクトリを削除します。
tmp=$(mktemp) &&
{
rm -f -- "$tmp"
find ~ -depth -mindepth 1 ! -name '.*' -mtime +14 -type d -print0 >&3
find ~ -mtime +14 ! -name '.*' ! -type d -delete
xargs -r0 rmdir <&4 2> /dev/null
} 3> "$tmp" 4< "$tmp"
または、次のように使用しますmoreutils
sponge
(これはファイル全体のリストをメモリに保存することを意味しますが):
find ~ -depth -mindepth 1 ! -name '.*' -mtime +14 -type d -print0 |
sponge sh -c '
find ~ -mtime +14 ! -name ".*" ! -type d -delete
xargs -r0 rmdir'
Orzsh
の=(...)
手続き型代替形式:
{
find ~ -mtime +14 ! -name ".*" ! -type d -delete
xargs -r0 rmdir
} < =(find ~ -depth -mindepth 1 ! -name '.*' -mtime +14 -type d -print0)
または、古いかどうかに関係なく、すべての空のディレクトリを削除できます。
find ~ -mindepth 1 ! -name '.*' \( -mtime +14 ! -type d -o -type d -empty \) -delete