Я бы использовал массив:
myArray=($(echo "hello world 15 42" | egrep -o '([0-9]+)'))
Доступ к первой подстроке:
echo ${myArray[0]}
15
...и второй:
echo ${myArray[1]}
42
При очистке файлов и папок можно использовать команду du
.
du
перечисляет использование дискового пространства, имеет параметр --time
и может использоваться только для каталогов . Комбинируя их:
du -h */ --time | grep -E '2019\-09\-(18|19|20)'
Будет захвачен любой подкаталог, содержимое которого в последний раз создавалось или изменялось 18, 19 или 20 ноября. Он выведет размер(-h
удобочитаемый ), дату модификации и, наконец, путь.
22 ноября 2019 года следующий код создаст в $pattern
строку, которая будет 20191121|20191120|20191119
. Он делает это, используя один вызов GNU date
для получения дат, а затем объединяет результаты с |
в качестве разделителя. Обратите внимание, что утилита по умолчанию date
в Solaris не может использоваться таким образом, поэтому мы используем имяgdate
(GNU date
в Solaris по умолчанию ).
readarray -t dates < <(
cat <<END_DATE_INPUT | gdate -f - +'%Y%m%d'
1 day ago
2 days ago
3 days ago
END_DATE_INPUT
)
pattern=$( IFS='|'; printf '%s' "${dates[*]}" )
Это можно использовать в качестве шаблона расширенной оболочки в bash
для удаления требуемых каталогов на основе их имен, а также для отображения их размеров (с помощьюdu
):
shopt -s extglob
du -s -h /opt/png/wsm/data/workdir/batch/*@($pattern)*/
#rm -r -f /opt/png/wsm/data/workdir/batch/*@($pattern)*/
Если у вас много тысяч таких каталогов, используйте цикл:
shopt -s extglob
for dirpath in /opt/png/wsm/data/workdir/batch/*@($pattern)*/
do
du -s -h "$dirpath"
#rm -r -f "$dirpath"
done
Возможно, вы захотите протестировать это, заменив rm
на echo
перед запуском "вживую".
Если у вас есть доступ к zsh
оболочке (, которая есть в Solaris ), и вас устраивает работа по последней -измененной метке времени в каталогах (, т.е. когда что-то было добавлено или удалено в каталоге в последний раз):
du -s -h /opt/png/wsm/data/workdir/batch/*(/m-3m+0)
(и аналогично дляrm
).
Квалификатор glob (/m-3m+0)
заставляет предыдущий шаблон соответствовать только каталогам, которые были изменены в течение последних трех дней, но более дня назад. Обратите внимание, что при этом не используются имена файлов каталогов.
Предыдущий ответ не будет выполнен, если каталоги, которые вы пытаетесь rm, содержат более 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 для получения дополнительной информации (от терминала (best )или от man7.org, чтобы получить справочную страницу -до -даты :http://man7.org/linux/man-pages/man1/find.1.html, но не от Die.net (они даже удаляют временные метки страниц, так что вы не знаете их справочных страниц или лет и устарели )).
Тогда гораздо более короткий и (с моей точки зрения )более читаемый синтаксис для решения @Kusalananda и использование даты вместо gdate (хотя, может быть, gdate является эквивалентом даты в 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