Cronjob -Удаление инодов % из команды, отправка по электронной почте

Команды, которые вы показали , должны , как говорит terdon , работать.

Альтернатива, избавляющая отtee:

rm -f /drives/d/matched_subdirs.txt
while IFS= read -r pathname; do
    find "$pathname" -name '*Bop*' -print \
        -exec sh -c 'printf "%s\n" "$@" >>matched' sh {} +
done 

Это позволит findраспечатать найденные пути для просмотра, а затем использовать встроенный сценарий оболочки для их записи в файл результатов.

Меня немного беспокоит то, что вы собираетесь делать с путями в выходном файле. Если вы собираетесь использовать их для зацикливания позже, лучше сделать это непосредственно из find. В противном случае у вас были бы проблемы со странными именами файлов, содержащими встроенные символы новой строки.


В комментариях вы говорите , что собираетесь использовать найденные пути в цикле для запуска rsync. Вызов rsyncдля каждого пути был бы очень медленным, и вам лучше сделать это с помощью rsyncнапрямую:

while IFS= read -r pathname; do
    rsync -avR --include='*/' --include='*Bop*' --exclude='*' --prune-empty-dirs "$pathname" target
done 

Здесь dirlist— это файл с вашими директориями.

Пример:

$ tree
.
|-- dirlist
`-- source
    |-- a
    |   |-- dir-1
    |   |   |-- somefile_Bop_here
    |   |   `-- someotherfile
    |   |-- dir-2
    |   |   |-- somefile_Bop_here
    |   |   `-- someotherfile
    |   `-- dir-3
    |       |-- somefile_Bop_here
    |       `-- someotherfile
    |-- b
    |   |-- dir-1
    |   |   |-- somefile_Bop_here
    |   |   `-- someotherfile
    |   |-- dir-2
    |   |   |-- somefile_Bop_here
    |   |   `-- someotherfile
    |   `-- dir-3
    |       |-- somefile_Bop_here
    |       `-- someotherfile
    `-- c
        |-- dir-1
        |   |-- somefile_Bop_here
        |   `-- someotherfile
        |-- dir-2
        |   |-- somefile_Bop_here
        |   `-- someotherfile
        `-- dir-3
            |-- somefile_Bop_here
            `-- someotherfile

13 directories, 19 files
$ cat dirlist
source/a
source/b/dir-2

(рабочий цикл здесь)

$ tree target
target
`-- source
    |-- a
    |   |-- dir-1
    |   |   `-- somefile_Bop_here
    |   |-- dir-2
    |   |   `-- somefile_Bop_here
    |   `-- dir-3
    |       `-- somefile_Bop_here
    `-- b
        `-- dir-2
            `-- somefile_Bop_here

7 directories, 4 files

Я решил использовать-R(--relative). Без него я бы получил

target
|-- a
|   |-- dir-1
|   |   `-- somefile_Bop_here
|   |-- dir-2
|   |   `-- somefile_Bop_here
|   `-- dir-3
|       `-- somefile_Bop_here
`-- dir-2
    `-- somefile_Bop_here

0
29.08.2020, 18:04
2 ответа

Я думаю, что это чище:

[ -n "$(df --output=ipcent | awk -F '%' 'NR>1 && $1>80')" ] && echo "80% hit."
  • df --output=ipcentвыводит только процентную колонку инодов.

  • awk -F '%' 'NR>1 && $1>80'пропускает заголовок (сNR>1)и проверяет, превышает ли процентное значение 80%, печатая строку, если да.

Вывод конвейера проверяется тестом -n:Если что-то было напечатано, то выдается echo. Замените echoпочтовой командой.

2
18.03.2021, 23:09

Если вы используете обычную версию GNU df, я предлагаю следующее

#!/bin/bash
df -P | {
   full=()
   read header # discard the first line
   while read fs blocks used free cap mount
   do
       cap=${cap%?} # remove the last character
       [ $cap -ge 80 ] && full+=("$mount%$cap")
   done
   [ ${#full[@]} -ne 0 ] && send_email.sh "${full[@]}"
}

-Pгарантирует, что каждая строка вывода является одной файловой системой, в противном случае dfимеет раздражающую причуду переноса строк, чтобы вывод выглядел красиво.

Сценарий предполагает, что в точках монтирования нет странных символов, таких как пробелы.

Отправитель _email.sh получает список файловых систем, которые используются на 80% или более. Формат - точка монтирования, знак процента и сумма. Отрегулируйте по мере необходимости.

1
18.03.2021, 23:09

Теги

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