%20%D0%B2%D0%BE%20%D0%B2%D1%81%D0%B5%D1%85%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0%D1%85%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20Bash.png)
Я ищу скрипт 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