Надеемся на эту помощь
set a=%username%
echo %a%
set a="hello"
echo %a%
Попробуйте следующее:
ls -t | sed -e '1,10d' | xargs -d '\n' rm
Это должно обрабатывать все символы (кроме новой строки) в имени файла.
Что здесь происходит?
ls -t
перечисляет все файлы в текущем каталоге в порядке убывания времени модификации. То есть, файлы, которые были изменены последними, первыми, по одному имени в строке. sed -e '1,10d'
удаляет первые 10 строк, т. Е. 10 самых новых файлов. Я использую это вместо tail
, потому что я никогда не могу вспомнить, нужен ли мне tail -n +10
или tail -n +11
. xargs -d '\ n' rm
собирает каждую строку ввода (без завершающей новой строки) и передает каждую строку в качестве аргумента в rm
. Как и с чем-либо подобным, поэкспериментируйте в безопасном месте.
Я просто нашел эту тему и решение от [1 116], mikecolley помог мне в первом шаге. Когда мне было нужно решение для одной строки homematic (raspberrymatic) сценарий, я столкнулся с проблемой, что эта команда только дала мне fileames а не целый путь, который необходим для" rm
". Моя используемая команда CUxD Exec не может запуститься в выбранной папке.
, Таким образом, вот мое решение:
ls -A1t $(find /media/usb0/backup/ -type f -name homematic-raspi*.sbk) | tail -n +11 | xargs rm
Объяснение:
find /media/usb0/backup/ -type f -name homematic-raspi*.sbk
ищущий только файлы -type f
whiche называют как -name homematic-raspi*.sbk
(чувствительными к регистру) или используют -iname
(нечувствительный к регистру) в папке /media/usb0/backup/
ls -A1t $(...)
, перечисляют файлы, данные find
без файлов, запускающихся с или ".." -A
отсортированный по mtime -t
и с возвратом возврата только одного столбца -1
tail -n +11
только последнего 10 -n +11
строки для следующего rm
xargs rm
и наконец удаляют врезающиеся файлы в списке , Возможно, это помогает другим от более длительного поиска и делает решение более гибким.
Использование inode числа с помощью команды stat & find (чтобы избежать проблем с надоедливыми символами в имени файла):
stat -f "%m %i" * | sort -rn -k 1,1 | tail -n +11 | cut -d " " -f 2 | \
xargs -n 1 -I '{}' find "$(pwd)" -type f -inum '{}' -print
#stat -f "%m %i" * | sort -rn -k 1,1 | tail -n +11 | cut -d " " -f 2 | \
# xargs -n 1 -I '{}' find "$(pwd)" -type f -inum '{}' -delete
Правильный способ делать такие вещи - использовать logrotate
.
stat -c "%Y %n" * | sort -rn | head -n +10 | \
cut -d ' ' -f 1 --complement | xargs -d '\n' rm
Разбивка: получите время последнего изменения для каждого файла (в формате « время
имя файла
»), отсортируйте их от самого старого к самому новому, сохраните все записи, кроме последних десяти, а затем сохраните все, кроме первого поля (оставьте только часть имени файла).
Редактировать : Использование cut
вместо awk
, поскольку последнее не всегда доступно
Редактировать 2 : Теперь обрабатывает имена файлов с пробелами
Поэкспериментируйте с этим, потому что я не уверен на 100%, что это сработает:
cd /backups; ls -at | tail -n +10 | xargs -I{} "rm '{}'"
Мне нравятся ответы @Dennis Williamson и @Dale Hagglund. (+1 к каждому)
Вот еще один способ сделать это с помощью find
(с тестом -newer
), аналогичным тому, с которого вы начали.
Это было сделано в bash на cygwin ...
if [[ $(ls /backups | wc -l) > 10 ]]
then
find /backups ! -newer $(ls -t | sed '11!d') -exec rm {} \;
fi