ファイルの削除

ファイルの削除

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 -66歳未満、-mtime 66歳(実際には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ディレクトリを一度だけ作成して追加します。

関連情報