это можно решить, выполнив:
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
немного раздражает, но уверен.
Для удаления каталогов по их именам с помощью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
, если вывод выглядит так, как предполагалось, и снова запустите сценарий, чтобы действительно удалить эти каталоги.
Ваш заголовок немного вводит в заблуждение, поскольку вы не можете использовать временные метки и должны доверять именам.
Возможное решение
keepAfter=$(date -d '-6 days' +'%F')
for d in */
do
[[ "$d" < "$keepAfter"/ ]] && echo rm -rf $d
done
Удалите echo
, если вас устраивают результаты
Другое решение:
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