Вопрос: (Ubuntu / Linux) команда «find» дает разные результаты, основанные на кавычках


Я использовал

find -iname *prib*

и получить только один результат "./prib09jack.pdf" с

find -iname "*prib*" 

Я получаю еще много результатов, которые я искал, таких как

./Dir1/PRIB09/prib09jackTFF1.pdf

и многое другое, но почему было важно, чтобы кавычки были вокруг "PRIB«?

Лучший.


4
2017-08-26 16:13


Источник


Вы запустили команду из того же каталога и получили разные ответы? Какова была вся структура команд поиска, которую вы использовали, поскольку существует множество вариантов, которые влияют на результат. - dtlussier
Я был в одном каталоге для каждого использования, меняя только цитаты вокруг строки поиска. - Vass


Ответы:


Если есть файл (или файлы), соответствующий *prib* в текущем каталоге при выполнении команды find оболочка будет расширять подстановочный знак, чтобы соответствовать имени файла сначала, прежде чем передавать аргументы найти, и приведет к выполнению другой команды, которую ожидает пользователь.

Например,

$ ls foo*
foobar

$ find -iname foo*
./foobar

$ find -iname "foo*"
./foobar
./dir/foobz
./dir2/fooblat

Короче говоря, Quotes задерживает подстановочную интерпретацию для команды find для выполнения. Отсутствие котировок сразу расширяется.


10
2017-08-26 16:42



ничего себе, это было глубоко. Я не могу сказать, что я это полностью понял. Так должен ли я всегда использовать кавычки в подобных ситуациях? То, что вы сказали, похоже на то, что если встречается строка, соответствующая форме группового поиска, последующие поиски следуют этому первоначальному расширению подстановочных знаков. И что цитаты прекращают это от происходящего. (если я не ошибаюсь, страница руководства ничего не говорит, чтобы избежать такой ошибки). - Vass
Вы найдете это объясненным в bash man, а не find man, потому что цитирование обрабатывается оболочкой. В принципе (повторить то, что сказал kmarsh), если вы используете *prib* без кавычек, bash ищет файлы в текущем каталоге с именами, соответствующими этому шаблону, и заменяет *prib* с именами файлов перед вызовом find, Если вы используете кавычки, bash оставляет *prib* в одиночестве. - David Z
@Vass: вы можете использовать echo *prib* и такое, чтобы увидеть, что bash делает с аргументами, прежде чем передать их команде. echo сам просто печатает его аргументы без изменений, поэтому он выводит информацию о том, что bash расширил *prib*, - sth
@sth zaw. Большое спасибо. это был глаз. Спасибо, что потрудились рассказать мне об этом. Это похоже на другое измерение в командной строке, о котором я не знал. - Vass
@David, спасибо за разработку и @Vass, рад помочь и поблагодарить за принятый ответ. @sth хорошая точка, я также использую эхо, когда хочу посмотреть, что произойдет с расширением подстановки. - kmarsh


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

find -iname \*iprib\*

и это сработает. Главное, вы хотите, чтобы подстановочные знаки заставили его находить неинтерпретируемым что-либо еще на этом пути (например, ваша оболочка).


1
2017-08-26 20:18