Сценарий оболочки для подсчета файлов, затем удаления самых старых файлов - PullRequest
48 голосов
/ 02 июня 2010

Я новичок в сценариях оболочки, поэтому мне нужна помощь здесь. У меня есть каталог, который заполняется резервными копиями. Если у меня более 10 файлов резервных копий, я хотел бы удалить самые старые файлы, чтобы остались только 10 новейших файлов резервных копий.

Пока что я знаю, как подсчитать файлы, что кажется достаточно простым, но как мне тогда удалить самые старые файлы, если их число превышает 10?

if [ls /backups | wc -l > 10]
    then
        echo "More than 10"
fi

Ответы [ 10 ]

86 голосов
/ 03 июня 2010

Попробуйте это:

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.

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

23 голосов
/ 04 апреля 2017

find является общим инструментом для такого рода задач:

find ./my_dir -mtime +10 -type f -delete

ПОЯСНЕНИЯ

  • ./my_dir ваш каталог (замените его своим собственным)
  • -mtime +10 старше 10 дней
  • -type f только файлы
  • -delete Не удивительно. Удалите его, чтобы проверить фильтр find перед выполнением всей команды

И позаботьтесь о том, чтобы ./my_dir существовало, чтобы избежать неприятных сюрпризов!

12 голосов
/ 03 июня 2010

Правильный способ сделать это можно с помощью logrotate.

7 голосов
/ 18 июня 2014

Убедитесь, что ваш pwd является правильным каталогом для удаления файлов (при условии, что в имени файла только обычные символы):

ls -A1t | tail -n +11 | xargs rm

хранит 10 новейших файлов. Я использую это с программой камеры 'motion', чтобы сохранить самые последние файлы захвата кадров. Спасибо всем последующим ответам, потому что вы показали мне, как это сделать.

3 голосов
/ 12 июня 2010

Мне нравятся ответы от @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
2 голосов
/ 20 мая 2016

Простой счетчик файлов:

max=12
n=0
ls -1t *.dat |
while read file; do
    n=$((n+1))
    if [[ $n -gt $max ]]; then
        rm -f "$file"
    fi
done
1 голос
/ 19 сентября 2017

В очень ограниченном окружении chroot у нас было всего несколько программ для достижения того, что было изначально задано. Мы решили это так:

MIN_FILES=5
FILE_COUNT=$(ls -l | grep -c ^d )


if [ $MIN_FILES -lt $FILE_COUNT  ]; then
  while [ $MIN_FILES -lt $FILE_COUNT ]; do
    FILE_COUNT=$[$FILE_COUNT-1]
    FILE_TO_DEL=$(ls -t | tail -n1)
    # be careful with this one
    rm -rf "$FILE_TO_DEL"
  done
fi

Пояснение:

  • FILE_COUNT=$(ls -l | grep -c ^d ) считает все файлы в текущей папке. Вместо grep мы также можем использовать wc -l, но wc не был установлен на этом хосте.
  • FILE_COUNT=$[$FILE_COUNT-1] обновить текущий $FILE_COUNT
  • FILE_TO_DEL=$(ls -t | tail -n1) Сохранить самое старое имя файла в переменной $FILE_TO_DEL. tail -n1 возвращает последний элемент в списке.
1 голос
/ 02 июня 2010
stat -c "%Y %n" * | sort -rn | head -n +10 | \
        cut -d ' ' -f 1 --complement | xargs -d '\n' rm

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

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

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

0 голосов
/ 03 июня 2010

Использование номеров инодов с помощью команды stat & find (чтобы избежать проблем с pesky-chars-in-file-name):

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 
0 голосов
/ 02 июня 2010

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

cd /backups; ls -at | tail -n +10 | xargs -I{} "rm '{}'"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...