Saya melakukan tugas ini secara teratur, dan saya menggunakan varian berikut ini. Ini adalah pipa yang menggabungkan berbagai alat sederhana: Temukan semua file, tambahkan waktu modifikasi file, sortir, hapus waktu modifikasi file, tampilkan semua baris kecuali 500 yang pertama, dan hapus:
find foo/ -type f | perl -wple 'printf "%12u ", (stat)[9]' | \
sort -r | cut -c14- | tail -n +501 | \
while read file; do rm -f -- "$file"; done
Beberapa komentar:
Jika Anda menggunakan "bash", Anda harus menggunakan "read -r file", bukan hanya "read file".
Menggunakan "perl" untuk menghapus file lebih cepat (dan juga menangani karakter "aneh" dalam nama file lebih baik daripada while-loop, kecuali jika Anda menggunakan "read -r file"):
... | tail -n +501 | perl -wnle 'unlink() or warn "$_: unlink failed: $!\n"'
Beberapa versi "tail" tidak mendukung opsi "-n", jadi Anda harus menggunakan "tail +501". Cara portabel untuk melewati 500 baris pertama adalah
... | perl -wnle 'print if $. > 500' | ...
Ini tidak akan berfungsi jika nama file Anda mengandung baris baru.
Itu tidak memerlukan GNU find.
Menggabungkan di atas memberi Anda:
find foo/ -type f | perl -wple 'printf "%12u ", (stat)[9]' | \
sort -r | cut -c14- | perl -wnle 'print if $. > 500' | \
perl -wnle 'unlink() or warn "$_: unlink failed: $!\n"'
rm -f
.