検索:「ディレクトリが空ではありません」を抑制します。

検索:「ディレクトリが空ではありません」を抑制します。

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

関連情報