Удалить все файлы (кроме четырех самых новых) во всех каталогах с помощью скрипта Bash

Удалить все файлы (кроме четырех самых новых) во всех каталогах с помощью скрипта Bash

Я ищу скрипт Bash, который перейдет в список каталогов и удалит все, кроме четырех последних созданных файлов.

Как я могу это сделать?

решение1

ls -t | sed '1,4d' | xargs echo rm

Удалите его, echoкогда будете удовлетворены желаемым результатом.

Если имена файлов содержат пробелы, потребуется проделать дополнительную работу.

решение2

Хотите ли вы сохранить четыре последних файла в каждом каталоге или четыре последних файла в ЛЮБОМ каталоге?

Чтобы решить первую проблему, вы бы использовали find для перечисления каждого каталога, затем в каждом из них удалили бы все, кроме четырех последних файлов. Это не так уж и сложно.

Чтобы решить вторую задачу, нужно немного больше думать, но на самом деле ее легче написать.

В принципе, рекурсивно найдите каждый файл. Вызовите команду "stat", которая вернет время изменения и имя файла. Отсортируйте это по убыванию и пропустите первые четыре файла, которые являются самыми последними.

Затем удалите начальные временные метки и удалите полученный список имен файлов.

Что-то вроде (не проверено):

#!/bin/bash

find "$@" -type f -print0 \
| xargs -0 stat -c$'%Y\t%n' \
| sort -rn \
| awk -F$'\t' 'NR > 4 {print $2}' \
| while read f; do
    echo rm -v "${f}"
  done

Это должно работать, хотя вам нужно будет удалить 'echo' в цикле while, чтобы сделать это эффективным. Сначала тщательно протестируйте это!

решение3

Я понимаю, что это не совсем то, о чем вы спрашиваете, но для такого рода резервного копирования я предпочитаю ротировать файлы журнала перед созданием нового. Это немного более явно и гораздо проще в кодировании, например:

#!/bin/bash

#Archive old backups
move () {
  if [ -e $1 ]
  then
    echo "Archiving old backups: $1 to $2"
    mv -f $1 $2 || echo "FAILED"
  fi
}

#Bump each backup +1
rm -rf backup.4
move backup.3.tgz backup.4.tgz
move backup.2.tgz backup.3.tgz
move backup.1.tgz backup.2.tgz
move backup.tgz backup.1.tgz

#Now create today's backup
...

решение4

Самый простой способ:

for d in dir1 dir2 dir3; do
  rm -vf `ls -1t $d | head -n-4` 
done

Связанный контент