Проблема заключается в приоритете операторов и/или в выражении find
. В частности, неявное И между соседними тестами имеет более высокий приоритет, чем ИЛИ(-o
)между двумя тестами имени. Таким образом, тестовое выражение анализируется как:
-maxdepth 1 -mindepth 1 -type f -name '*sv*'
OR
-name '*.json' -exec basename {} \;
... и поскольку -name '*.json'
является единственным, который является частью той же ветки, что и -exec
, -exec
работает только для файлов json.
Решение состоит в том, чтобы переопределить нормальный приоритет с помощью явных круглых скобок вокруг -name
тестов:
nbs_files=$(ssh -q -i ${sshkey} ${user}@${server} "find ${path}/ -maxdepth 1 -mindepth 1 -type f '(' -name '*sv*' -o -name '*.json' ')' -exec basename {} \; | wc -l")
Кстати, я также взял на себя смелость заменить обратные кавычки на $( )
--, они являются более современным вариантом, их легче читать и в них нет тех же странных аномалий выхода, которые есть у обратных кавычек. См. этот вопрос и BashFAQ #82 .