![ディレクトリにN個以上のファイルがある場合、ディレクトリから最も古いファイルを削除するbashスクリプトをどのように作成できますか? [コピー]](https://linux33.com/image/48593/%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%ABN%E5%80%8B%E4%BB%A5%E4%B8%8A%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E3%81%82%E3%82%8B%E5%A0%B4%E5%90%88%E3%80%81%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%8B%E3%82%89%E6%9C%80%E3%82%82%E5%8F%A4%E3%81%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8Bbash%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E4%BD%9C%E6%88%90%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
スクリプトの書き方が気になります。
ディレクトリ内のファイル数を数えます。
この数値が指定された数値 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 --
ファイルの削除(--
で始まるファイル名を処理するには、ファイル名の前に置く-
)