Запустите find и rsyn c из bash скрипта - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь запустить команду find с помощью команды rsyn c. Я последовал за ответом здесь .
Когда я запускаю его из командной строки, он запускается нормально.

find ./copy1 -mtime +14  -printf %P\\0 | rsync -avc --dry-run --files-from=- --from0 ./copy1 /home/shlo/copy1/

Проблема началась, когда я запускаю ее из bash script:

RSYNC_COM='find ./copy1 -mtime +14  -printf %P\\0 | rsync -avc --dry-run --files-from=- --from0 ./copy1 /home/shlo/copy1/'
output=$($RSYNC_COM 2>&1)

Я получаю сообщение об ошибке :

find: пути должны предшествовать выражению: | Использование: find [-H] [-L] [-P] [-Olevel] [-D help | tree | search | stat | rate | opt | exec] [path ...] [expression]

Похоже, он думает, что команда rsyn c является параметрами в команде поиска.

Как это исправить?

Спасибо

1 Ответ

2 голосов
/ 26 февраля 2020

Проблема в том, что вы назначаете команду переменной. | больше не анализируется как "оператор" канала, а как обычная строка.

# echo 123 | cat
123
# a="echo 123 | cat"
# $a
123 | cat

| является недопустимым аргументом для find, поэтому он возвращает ошибку.

Используйте функцию:

rsync_com() {
         find ./copy1 -mtime +14  -printf %P\\0 |
         rsync -avc --dry-run --files-from=- --from0 ./copy1 /home/shlo/copy1/
}
output=$(rsync_com 2>&1)

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

Соглашение состоит в том, что переменные верхнего регистра зарезервированы для экспортируемых переменных.

...