X日より古いファイルのみを含むディレクトリを見つける方法は?

X日より古いファイルのみを含むディレクトリを見つける方法は?

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-maxdepthprintf

この特定の例では、(日)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

おすすめ記事