X日を過ぎたファイル(作成/変更)のみを含むディレクトリを削除する必要があります。
これを試してみましたが、今日のファイルのみが表示され、再帰的には表示されません。
for d in *; do
find "$d" -mindepth 1 -mtime -180 -print -quit | | grep -q . ||
echo rm -rf "$d";
done
ベストアンサー1
あなたが欲しい」X日より古いファイルのみを含むディレクトリを削除する」。
これを処理する1つの方法は次のとおりです。
- リーフノードから始めて、各ディレクトリに対して次のようにします。
- サブディレクトリの数を数えます。 0以外の場合はスキップします。
- ディレクトリ以外の項目の数を計算します。 0の場合はスキップします。
- 基準(年齢)と一致する文書数の計算
- 両方のファイルの番号が同じ場合は、そのディレクトリを削除してください。
このソリューションには、GNUまたは、find
およびを理解する代替バージョンが必要です。-mindepth
-maxdepth
printf
この特定の例では、(日)X
に設定されています。180
days=180
find ./* -depth -type d -exec sh -c '
[ -z "'"$days"'" ] && exit 1
printf "Considering directory: %s\n" "$1"
dirs=$(find "$1" -mindepth 1 -maxdepth 1 -type d -print | xargs)
if [ -n "$dirs" ]
then
printf "Found child directories: (%s)\n" "$dirs"
exit 0
fi
all=$(find "$1" -maxdepth 1 ! -type d -printf x | wc -c)
got=$(find "$1" -maxdepth 1 -type f -mtime +'"$days"' -printf x | wc -c)
printf "Found %d item(s) and matched %d\n" $all $got
if [ $all -gt 0 ] && [ $all -eq $got ]
then
printf "Delete directory: %s\n" "$1"
: rm -rf "$1"
fi
' _ {} \;
変数の2つの用途を囲む見かけ上の奇妙な引用符は、スクリプトの残りの部分が一重引用符$days
で囲まれているのに対し、変数は二重引用符で囲まれて値を決定できるようにするためです。'..start of script..' "$variable" '..remainder of script..'
ある種の引用符の終わりと別の種類の引用符の先頭との間にスペースがないことを理解するのは簡単かもしれません。
printf
コードを自動的に実行するには、次の文を削除してください。削除する準備ができたら、:
前のコロン()を削除してください。rm -rf