
7日より古いファイルを削除してから7日より古い空のディレクトリを削除するには、次のコードを作成しました。
ファイルの削除
find "$CDIR" ! -type d -mtime +7 -exec sh -c '
for pathname do
if ! rm -fv "$pathname"; then
((err_count_f++))
fi
done' sh {} +
ディレクトリの削除
find "$CDIR" -type d -empty -mtime +7 -exec sh -c '
for pathname do
if ! rmdir -v "$pathname"; then
((err_count_d++))
fi
done' sh {} +`
ただし、ディレクトリ内のファイルを削除すると、そのディレクトリのmtimeが変更されるため、リンクされた空のディレクトリは削除されません。この問題を克服する最良の方法は何ですか?
答え1
互換性zsh
(およびGNUfind
または互換性-delete
):
cd -P -- "$CDIR" || exit
old_dirs=(**/*(DNm+6))
find . -mtime +6 ! -type d -delete
empty_old_dirs=($^old_dirs(N^F))
(($#empty_old_dirs == 0)) || rmdir -- $empty_old_dirs
-mtime
およびzsh
のグローバル修飾子は、整数m
(下り)日数で表される年齢に適用されます。-mtime -6
6歳未満、-mtime 6
6歳(実際には6~7日)-mtime +6
、厳しく6日以上、つまり7日以上です。
-mtime +6
したがって、7日より古いファイルの場合は代わりに必要です-mtime +7
(少なくともPOSIX準拠のfind
実装では、すべてのファイルではなくGNUファイルがそうです)。
答え2
まず、7日前の空のディレクトリを一時ファイルに追加してから、ファイル削除を実行できます。次に、空のディレクトリを検索してファイルを確認します。
dirs_mtime7=$(mktemp) ## Create a temp file.
find "$CDIR" -type d -mtime +7 >> "${dirs_mtime7}"
##
## File deletion find command goes HERE ...
##
while IFS= read -r -d '' a; do
grep -q -F -f "${dirs_mtime7}" <<< "${a}" && rmdir -v "${a}"
done < <(find "$CDIR" -type d -empty -print0)
このディレクトリは古いので、一時ファイルに7日間の新しいディレクトリを追加するだけです。 dirs_mtime7ディレクトリを一度だけ作成して追加します。