Сценарий оболочки для подсчета файлов затем удалите самые старые файлы

Надеемся на эту помощь

set a=%username%
echo %a%    
set a="hello"
echo %a%
51
задан Nic Hubbard 2 June 2010 в 06:27
поделиться

7 ответов

Попробуйте следующее:

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 .

Как и с чем-либо подобным, поэкспериментируйте в безопасном месте.

87
ответ дан 7 November 2019 в 09:54
поделиться

Я просто нашел эту тему и решение от [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 и наконец удаляют врезающиеся файлы в списке

, Возможно, это помогает другим от более длительного поиска и делает решение более гибким.

1
ответ дан 7 November 2019 в 09:54
поделиться

Использование 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 
-2
ответ дан 7 November 2019 в 09:54
поделиться

Правильный способ делать такие вещи - использовать logrotate .

11
ответ дан 7 November 2019 в 09:54
поделиться
stat -c "%Y %n" * | sort -rn | head -n +10 | \
        cut -d ' ' -f 1 --complement | xargs -d '\n' rm

Разбивка: получите время последнего изменения для каждого файла (в формате « время имя файла »), отсортируйте их от самого старого к самому новому, сохраните все записи, кроме последних десяти, а затем сохраните все, кроме первого поля (оставьте только часть имени файла).

Редактировать : Использование cut вместо awk , поскольку последнее не всегда доступно

Редактировать 2 : Теперь обрабатывает имена файлов с пробелами

1
ответ дан 7 November 2019 в 09:54
поделиться

Поэкспериментируйте с этим, потому что я не уверен на 100%, что это сработает:

cd /backups; ls -at | tail -n +10 | xargs -I{} "rm '{}'"
-6
ответ дан 7 November 2019 в 09:54
поделиться

Мне нравятся ответы @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
3
ответ дан 7 November 2019 в 09:54
поделиться