1

Я пытаюсь использовать команду find и натолкнулся на статью на http://www.linux.ie/newusers/beginners-linux-guide/find.php, в которой говорится:

Подстановочный знак экранируется косой чертой, поэтому BASH отправляет буквенную звездочку утилите поиска в качестве аргумента вместо расширения имени файла и передачи любого количества файлов в качестве аргументов.

по команде find . -name up\* .

Будучи новичком в мире Linux, я не совсем понимаю, как использование обратной косой черты, которая предназначена для экранирования метасимвола * , интерпретируется и возвращает результаты, как если бы они передавались для find . Означает ли это, что если я использую опцию -name мне нужно использовать обратную косую черту, чтобы передать подстановочный знак, и если я не использую -name мне не нужно использовать обратную косую черту? Также используется ли обратная косая черта, чтобы оболочка bash не пыталась ее расширить?

2 ответа2

2

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

Вы ищете все файлы из текущего каталога, имена которых начинаются с "вкл", верно? Если вы позволите оболочке расширить *, вы не получите этого. Предположим, что ваш текущий каталог содержит файлы "вверх" и "uplift". Затем оболочка изменяет вашу команду на

find . -name upward uplift

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

1

Знайте, что вы используете термин "регулярное выражение" довольно свободно. То, с чем вы имеете дело в параметре find -name довольно близко по поведению к shell glob ... С другой стороны, find -regex вариант использует поиск регулярного выражения. Вы можете выбрать, какой стиль регулярного выражения использовать, используя опцию -regextyp. На данный момент реализованы следующие типы: emacs (по умолчанию), posix-awk, posix-basic, posix-egrep и posix-extended. ...

То, как вы справляетесь с обратной косой чертой, звездочкой и т.д., Может варьироваться в зависимости от того, что вы хотите сделать.  Если вы хотите, чтобы команда find -name считала его звездочкой как символ подстановки, то вам нужно убедиться, что он НЕ экранирован, когда команда find действительно читает шаблон из командной строки.

Чтобы гарантировать, что find получает его в неэкранированном виде, вы должны запретить оболочке (обычно bash) выполнять * (очень мощное) расширение оболочки на звездочке ... Чтобы защитить его, вы ДОЛЖНЫ избегать его на уровне командной строки (то есть "избегать его" в глазах оболочки). Ключевой концепцией на данный момент является "защита"...

Вы можете защитить свою звездочку от оболочки тремя способами:

  • используйте ' одинарные кавычки '
  • используйте " двойные кавычки "
  • использовать \ обратную косую черту (и без кавычек)

Таким образом, для find чтобы увидеть вашу звездочку как подстановочный знак, подойдет любой из следующих методов "защиты".

  • find -name up'*'
  • find -name up"*"
  • find -name up\*
  • find -name 'up*'
  • find -name "up*"
  • find -name "up"\*

Обратите внимание, что оболочка никогда не будет выполнять раскрытие чего-либо в ' одинарных кавычках ' ... " двойные кавычки " - это отдельная история.

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