ディレクトリにN個以上のファイルがある場合、ディレクトリから最も古いファイルを削除するbashスクリプトをどのように作成できますか? [コピー]

ディレクトリにN個以上のファイルがある場合、ディレクトリから最も古いファイルを削除するbashスクリプトをどのように作成できますか? [コピー]

スクリプトの書き方が気になります。

ディレクトリ内のファイル数を数えます。

この数値が指定された数値 N より大きい場合、ディレクトリ内の最も古いファイルは削除されます。

追加の好意を得るには、カウント/削除に.zipファイルのみを含めてください。

答え1

たとえば、フォルダに50を超えるファイルがある場合にのみ作業を実行するには、次の手順を実行します。

shopt -s dotglob nullglob
for file in *; do
    [[ -f $file ]] && files+=( "$file" )
done
if (( ${#files[@]} > 50 )); then
    IFS= read -r -d $'\0' line < <(find . -maxdepth 1 -type f -printf '%T@ %p\0' 2>/dev/null | sort -z -n)
    rm "${line#* }"
fi

答え2

N=50
[[ $( ls | wc -l ) -gt $N ]] && ls -tr | tail -n1 | tr \\n \\0 | xargs -0 echo rm

ほとんどテストされていませんが、これが近いと思います。テキスト出力がうまくいけば、それを削除してecho有効にすることができます。

  • lsファイルのリスト
  • wc数えてみてください
  • [[ ... -gt ... ]]もし
  • &&それから
  • ls -tr年齢逆順でファイルを一覧表示
  • tail -n1最後の行のみを表示(1必要に応じて交換)
  • tr \\n \\0ファイル名の間に\0区切り記号を設定する(ここでは1つのみ)
  • xargs -0 echo rm --\0見つかった各引数(sで区切られた)を次に追加します。echo rm --
  • echo rm --結果が実際に望ましい結果であることを確認する機会を提供する
  • rm --ファイルの削除(--で始まるファイル名を処理するには、ファイル名の前に置く-

関連情報