Bash Сравнение скриптов в сочетании с getfattr - PullRequest
0 голосов
/ 17 марта 2020

Я в настоящее время застрял с проблемой в моем Bash сценарии и, кажется, работает все глубже в темноте с каждой попыткой исправить это.

Справочная информация: у нас есть папка, которая заполняется с пронумерованными папками cra sh, которые заполняются файлами cra sh. Кто-то экспортирует список этих папок ежедневно. Во время этого экспорта нумерованные папки cra sh получают атрибут «user.exported = 1».

Некоторые из них не экспортируются, поэтому они не будут иметь атрибута, и их следует удалять, только если они старше 30 дней.

Моя проблема: я настраиваю скрипт bash, который в конце концов запускается через Cron, чтобы регулярно проверять папки, которые имеют атрибут "пользователь" .exported = 1 "и старше 14 дней и удаляет их через rm -rfv FOLDER >> deleted.log

Однако у нас также есть папки, которые не имеют или получают атрибут" user.exported = 1 ", который затем необходимо удалить после того, как они старше 30 дней. Я создал сравнение IF ELIF FI, чтобы проверить это, но вот где я застрял.

Мой код:

#!/bin/bash

# Variable definition
LOGFILE="/home/crash/deleted.log"
DATE=`date '+%d/%m/%Y'`
TIME=`date '+%T'`
FIND=`find /home/crash -maxdepth 1 -mindepth 1 -type d`

# Code execution
printf "\n$DATE-$TIME\n" >> "$LOGFILE"

for d in $FIND; do
  # Check if crash folders are older than 14 days and have been exported
  if [[ "$(( $(date +"%s") - $(stat -c "%Y" $d) ))" -gt "1209600" ]] && [[ "$(getfattr -d --absolute-names -n user.exported --only-values $d)" == "1" ]]; then
    #echo "$d is older than 14 days and exported"
    "rm -rfv $d" >> "$LOGFILE"
  # Check if crash folders are older than 30 days and delete regardless
  elif [[ "$(( $(date +"%s") - $(stat -c "%Y" $d) ))" -gt "1814400" ]] && [[ "$(getfattr -d --absolute-names -n user.exported $d)" == FALSE ]]; then
    #echo "$d is older than 30 days"
    "rm -rfv $d" >> "$LOGFILE"
  fi
done

Часть IF работает нормально, и он удалил папки с атрибут "user.exported = 1", но часть ELIF, похоже, не работает, так как я получаю только вывод в моем bash, например:

/home/crash/1234: user.exported: No such attribut
./crash_remove.sh: Line 20: rm -rfv /home/crash/1234: File or Directory not found

Когда я смотрю в cra sh папка после запуска скрипта, папка и ее содержимое все еще там.

У меня определенно есть ошибка в моем скрипте, но я не вижу ее. Пожалуйста, кто-нибудь может мне помочь с этим?

Заранее спасибо

1 Ответ

4 голосов
/ 17 марта 2020

Только в кавычках расширения, а не вся команда.

Вместо:

"rm -rfv $d"

do:

rm -rfv "$d"

Если вы все это цитируете, bash пытается выполнить команду, названную буквально rm<space>-rfv<space><expansion of d>.

Не использовать обратные галочки `. Вместо этого используйте $(...). Bash хакеры вики устарели, устарел синтаксис .

Не for i in $(cat) или var=$(...); for i in $var. Используйте while IFS= read -r l oop. Как читать файл построчно в bash.

Вместо if [[ "$(( $(date +"%s") - $(stat -c "%Y" $d) ))" -gt "1814400" ]] просто выполните сравнение в арифметическом c расширении, например: if (( ( $(date +"%s") - $(stat -c "%Y" $d) ) > 1814400 )).

Я думаю, что вы могли бы сделать все это за find, как ::

find /home/crash -maxdepth 1 -mindepth 1 -type d '(' \
    -mtime 14 \
    -exec sh -c '[ "$(getfattr -d --absolute-names -n user.exported --only-values "$1")" = "1" ]' -- {} \; \
    -exec echo rm -vrf {} + \
')' -o '(' \
    -mtime 30 \
    -exec sh -c '[ "$(getfattr -d --absolute-names -n user.exported "$1")" = FALSE ]' -- {} \; \
    -exec echo rm -vrf {} + \
')' >> "$LOGFILE"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...