Команды, которые вы показали , должны , как говорит 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
Я думаю, что это чище:
[ -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
почтовой командой.
Если вы используете обычную версию 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% или более. Формат - точка монтирования, знак процента и сумма. Отрегулируйте по мере необходимости.