список каталогов, созданных за последние 3 дня, и отображение использования пространства

Я бы использовал массив:

myArray=($(echo "hello world 15 42" | egrep -o '([0-9]+)'))

Доступ к первой подстроке:

echo ${myArray[0]}
15

...и второй:

echo ${myArray[1]}
42
0
23.11.2019, 14:07
4 ответа

При очистке файлов и папок можно использовать команду du.

duперечисляет использование дискового пространства, имеет параметр --timeи может использоваться только для каталогов . Комбинируя их:

du -h */ --time | grep -E '2019\-09\-(18|19|20)'

Будет захвачен любой подкаталог, содержимое которого в последний раз создавалось или изменялось 18, 19 или 20 ноября. Он выведет размер(-hудобочитаемый ), дату модификации и, наконец, путь.

0
28.01.2020, 03:05

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)заставляет предыдущий шаблон соответствовать только каталогам, которые были изменены в течение последних трех дней, но более дня назад. Обратите внимание, что при этом не используются имена файлов каталогов.

0
28.01.2020, 03:05

Предыдущий ответ не будет выполнен, если каталоги, которые вы пытаетесь 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 (они даже удаляют временные метки страниц, так что вы не знаете их справочных страниц или лет и устарели )).

0
28.01.2020, 03:05

Тогда гораздо более короткий и (с моей точки зрения )более читаемый синтаксис для решения @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
0
28.01.2020, 03:05

Теги

Похожие вопросы