удалить каталог старше 7 дней

это можно решить, выполнив:

SCRIPT_PATH=$(dirname "$(readlink -f "$0")")
cd "$SCRIPT_PATH"
if [ ! -t 1 ]; then #not from terminal
    SCRIPT=$(basename "$(readlink -f "$0")")
    SUBPROC=1 x-terminal-emulator --profile "$USER" --working-directory "$SCRIPT_PATH" -e "./$SCRIPT" &
    exit 0    
fi
echo "output"
...
[[ -v SUBPROC ]] && read -p "Press any key to exit" -n1 junk

немного раздражает, но уверен.

0
28.04.2020, 08:06
3 ответа

Для удаления каталогов по их именам с помощьюbash:

#!/bin/bash

shopt -s nullglob
date=$(date -d '-7 day' '+%F')
for path in ~/delete/[0-9][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9]; do
  if [[ -d $path && ${path##*/} < $date ]]; then
    echo rm -rf "$path"
  fi
done

Это перебирает пути, соответствующие шаблону YYYY -MM -DD, и пропускает не -каталоги и каталоги. чьи имена не сортируются лексикографически до текущей даты -7 дней.

При включенном nullglobшаблон пути заменяется на нулевую строку, если нет соответствующих файлов/каталогов. и код внутри цикла не выполняется.

Удалите echo, если вывод выглядит так, как предполагалось, и снова запустите сценарий, чтобы действительно удалить эти каталоги.

1
19.03.2021, 02:25

Ваш заголовок немного вводит в заблуждение, поскольку вы не можете использовать временные метки и должны доверять именам.

Возможное решение

keepAfter=$(date -d '-6 days' +'%F')
for d in */
do 
    [[ "$d" < "$keepAfter"/ ]] && echo rm -rf $d 
done

Удалите echo, если вас устраивают результаты

1
19.03.2021, 02:25

Другое решение:

d=/path/to/deleted;
printf '%s\n' $d/*/ | awk -v upTo="$d/$(date -d '-6 days' +%F)" '$0<=upTo {print}' | xargs rm -r 

Во время -мес:

  • printf '%s\n' $d/*/генерирует поток, где каждая строка является подкаталогом/path/to/deleted(эта строка содержит полный путь:/path/to/deleted/2020-04-12)
  • это передается в awkс помощью

    • -v upTo="$d/$(date -d '-6 days' +%F)":создает переменную upTo, которая является последним каталогом для удаления (с полным путем:/path/to/deleted/2020-04-12)
    • '$0<=upTo {print}'— это программа awk, которая выводит только те входные строки, которые лексикографически меньше или равны содержимому upTo, поэтому она отфильтровывает каталоги после даты разрыва.
  • xargs rm -rприменяется rm -rко всем строкам из стандартного ввода (т. е. к каталогам, которые не были отфильтрованы)

Преимущество этого кода в том, что в нем нет цикла оболочки, а rmскорее всего вызывается только один раз для всех каталогов.

Если вы cd /path/to/deletedсначала код станет немного проще, (вам больше не понадобится $dпеременная ).

printf '%s\n' */ | awk -v upTo="$(date -d '-6 days' +%F)" '$0<=upTo {print}' | xargs rm -r 
1
19.03.2021, 02:25

Теги

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