Я хочу удалить 3 самых старых файла на основе их имени файла.
Вот пример того, что находится в моем резервном каталоге. Будет несколько копий с различными временами.
Ubuntu_Scripts.zip_2018-08-09-21
Это заканчивает тем, что удалило все файлы и не оставило новейший или два.
lst=$(ls -t /media/andy/MAXTOR_SDB1/Ubuntu_Mate_18.04/Ubuntu_Documents_*|tail -3)
for f in $lst;do if [ -f $f ];then rm -rf $f;
fi;готово
Если это помогло бы решить это, я могу генерировать файлы в date_filename формате.
Учитывая Ваш формат имени файла, простой лексический вид должен быть достаточным. Так, например,
printf '%s\0' Ubuntu_Scripts.zip_* | sort -z | head -zn3 | xargs -0 echo rm --
-z
не необходимо для Ваших примеров, но ничего не стоит и делает конвейер допустимым для любых официальных имен (включая тех, которые содержат новые строки).
Удалите echo
после того как Вы удовлетворены, что это определяет соответствующие файлы.
--
Если zsh
доступно, Вы могли удалить первые три файла соответствия, по имени возрастающие, используя встроенные спецификаторы шарика:
rm -- Ubuntu_Scripts.zip_*(.on[1,3])
#!/bin/bash
# Ubuntu_Mate 18.04 LTS
#
# Delete all but 2 newest files in selected directory
#
ls -1t /media/andy/MAXTOR_SDB1/Ubuntu_Mate_18.04/Documents_Backups/Ubuntu_Documents_* |
# skip (leave) the 2 newest
tail -n +3 |
# delete the 3 oldest
tail -n -3 |
while IFS= read -r file
do
rm "$file"
done
exit 0