Если вы хотите зациклить файлы, никогда не используйтеls
*. tl; dr Есть много ситуаций, когда вы в конечном итоге удалите не тот файл или даже все файлы.
Тем не менее, к сожалению, это сложно сделать прямо в Bash. Там в ответ работает над в виде дубликата вопроса моего даже старшеfind_date_sorted
, которые вы можете использовать с небольшими изменениями:
counter=0
while IFS= read -r -d '' -u 9
do
let ++counter
if [[ counter -gt 3 ]]
then
path="${REPLY#* }" # Remove the modification time
echo -e "$path" # Test
# rm -v -- "$path" # Uncomment when you're sure it works
fi
done 9< <(find . -mindepth 1 -type f -printf '%TY-%Tm-%TdT%TH:%TM:%TS %p\0' | sort -rz) # Find and sort by date, newest first
* Без обид, ребята - я тоже ls
раньше пользовался. Но это действительно не безопасно.
Изменить: Новыйfind_date_sorted
с юнит-тестами.
((++counter>3))
качестве теста. Это очень лаконично. Что касается односложных: если краткость является проблемой, закройте код в функции, тогда не беспокойтесь об этом.Чтобы удалить все, кроме 3 самых новых файлов, используя глоб zsh, вы можете использовать
Om
(заглавная O) для сортировки файлов от самых старых до самых новых и нижний индекс, чтобы получить нужные файлы.Другие примеры:
источник
Безусловно, самый простой способ - использовать zsh и его глобальные квалификаторы :
Om
сортировать по убыванию возраста (т. Е. Старшему первому) и[1,3]
сохранять только первые три совпадения.Смотрите также Как фильтровать глобус в zsh для большего количества примеров.
И прислушайтесь к совету l0b0 : ваш код ужасно сломается, если у вас есть имена файлов, которые содержат специальные символы оболочки.
источник
Вы можете использовать следующую функцию, чтобы получить самый новый файл в каталоге:
Дайте ему другой набор файлов, исключая новейший файл после каждой итерации.
Совет: если вы храните исходный набор файлов в массиве с именем «$ {files [@]}», сохраните индекс самого нового найденного файла и
unset 'files[index]'
перед следующей итерацией.Применение:
newest_in [set of files/directories]
Пример вывода:
источник
Во-первых,
-R
опция рекурсии, что, вероятно, не то, что вам нужно - она будет искать и во всех подкаталогах. Во-вторых,<
оператор (если он не рассматривается как перенаправление) предназначен для сравнения строк. Вы, вероятно, хотите-lt
. Пытаться:Но я бы использовал найти здесь:
источник
Я знаю, что разобрать грех
ls
, но как насчет этого:Быстрый тест с 5 пустыми файлами:
источник
ls
вывода и использованиеfind
иxargs
вместе в неправильном пути. Если вы объединяете,find
иxargs
я рекомендую вам использоватьfind
s-print0
и соответственноxargs
s-O
параметры. Читайте об использовании Find для получения дополнительной информации о предмете. Вы также можете посмотреть и прочитать, почему Парсинг ls очень плох.Этот однострочный делает все, что я думаю:
источник
Вот одно из решений:
источник