
В рамках очистки диска мне теперь необходимо удалить все папки и их содержимое, созданные за последние 3 дня (не текущую рабочую дату):
Пример - сегодняшняя дата 20191121, тогда:
/opt/png/wsm/data/workdir/batch/*20191120*
/opt/png/wsm/data/workdir/batch/*20191119*
/opt/png/wsm/data/workdir/batch/*20191118*
Все, что я могу сделать сейчас, это получить список:
ls -d */ | grep 20191118 (and then 19 and 20)
Как проверить, какой объем памяти я могу сэкономить, удалив определенную папку(и) с указанной датой и ее содержимое?
Версия bash на сервере:
bash-3.2$ bash --version
GNU bash, version 3.2.57(1)-release (i386-pc-solaris2.10)
Copyright (C) 2007 Free Software Foundation, Inc.
решение1
При очистке файлов и папок вам может понадобиться использовать du
команду.
du
список использования дискового пространства,есть --time
возможность, и может быть использовантолько для каталогов. Объединяя их:
du -h */ --time | grep -E '2019\-09\-(18|19|20)'
Это захватит любой подкаталог, содержимое которого было в последний раз создано или изменено 18, 19 или 20 ноября. Он выведет размер ( -h
в удобном для чтения виде), дату изменения и, наконец, путь.
решение2
Предыдущий ответ не сработает, если каталоги, которые вы пытаетесь удалить, содержат более 5000 файлов. Это оставит вас со старыми неудалёнными каталогами.
Вместо этого используйте find с "-exec rm {} \+", который вызовет rm один или несколько раз с максимум 5000 аргументами для каждого вызова.
Чтобы найти измененные файлы/каталоги, используйте find
find . -type d -atime n # for exact number of days
find . -type d -atime +n # for greater than n days
Вы можете добавить опцию -daystart, чтобы отсчитывать время с начала сегодняшнего дня, а не с 24 часов назад.
Затем используйте либо «-exec rm {} \+» для удаления, либо «-exec du -sh {} \;» для получения информации об использовании диска каждым каталогом.
Также рассмотрите опцию -maxdepth для вызовов find + du, чтобы ограничить поиск каталогами верхнего уровня.
Для получения дополнительной информации обратитесь к «man find» (из терминала (лучше всего) или к man7.org, чтобы получить актуальную страницу руководства):http://man7.org/linux/man-pages/man1/find.1.html, но не от Die.net (они даже удаляют временные метки страниц, так что вы не знаете, сколько им страниц man или лет и насколько они устарели)).
решение3
Тогда гораздо более короткий и (с моей точки зрения) более читаемый синтаксис для решения @Kusalananda, и использование date вместо gdate (хотя, может быть, gdate является эквивалентом date в Solaris?):
days=$(echo -e "1 day ago \n 2 days ago \n 3 days ago" | date -f - +'%Y%m%d')
dpath="/opt/png/wsm/data/workdir/batch"
for day in $days ; do
du -s -h "$dpath/$day"
rm -r -f "$dpath/$day"
done
решение4
Если в вашей системе Solaris есть bash
, то в ней, как правило, есть и zsh.
Поскольку этот формат даты сортируется как числа, вы можете использовать <start-end>
оператор glob диапазона десятичных чисел zsh:
zsh -c '
zmodload zsh/datetime
now=$EPOCHSECONDS day=$(( 24 * 60 * 60 ))
for var t (start $(( now - 3*day )) end $(( now - 1*day )) )
strftime -s $var %Y%m%d $t
range="<$start-$end>"
rm -rf -- *$~range*(/)
'
Помните, что если запустить его в неправильный день года посреди ночи при переходе с летнего времени на летнее и обратно, вычитание 24*60*60 секунд из текущего времени может привести к тому, что вы окажетесь в том же дне или на 2 дня назад.
Чтобы получить c
совокупное использование диска этими каталогами, замените rm -rf
на du -c
. Будет ли это количество места, которое будет освобождено после их удаления, зависит от того, имеют ли какие-либо файлы в этих каталогах жесткие ссылки в другом месте или нет.