команда find не работает с параметром имени -в файле sh

Используйте " " вместо ' ', что всегда полезно для Linux!

4
06.07.2020, 13:20
1 ответ

Проблема заключается в приоритете операторов и/или в выражении 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 .

5
18.03.2021, 23:21

Теги

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