2

Эта команда с * в пути поиска отлично работает на локальном сервере

Svr1$ find /path/*/foo/ -name "*20160208"

Когда я пытаюсь это удаленно с другого сервера, это не работает

Svr2$ ssh Svr1 find '/path/*/foo/' -name "*20160208*"

Сообщение об ошибке:

find: stat() error /path/*/foo/: No such file or directory

Однако, если я изменю путь поиска, чтобы избежать использования *, он будет работать нормально. Как это:

Svr2$ ssh Svr1 find '/path/' -name "*20160208*"

Есть идеи, что я делаю не так?

Большое спасибо.

2 ответа2

3

Ваша проблема в том, что команда find не интерполирует / интерпретирует глобальные каталоги (список каталогов, по которым нужно искать), а только интерполирует шаблон как глобальный глобус, который должен совпадать. То, что интерпретирует глобусы каталогов, - это сама оболочка, в которой вы запускаете поиск . Когда вы запускаете find через ssh, для этой работы нет оболочки.

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

Что-то вроде того, что я использовал на своей машине:

ssh lx@localhost "bash -c '/usr/bin/find /tmp/d* -name \"f*\" '"
lx@localhost's password:
/tmp/d1/f1
/tmp/d2/f2
0

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

Svr2$ ssh Svr1 "find /path/*/foo/ -name \"*20160208*\""

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .