find: значение \? знак как значение параметра имени

В чем смысл? войдите в следующую команду?

find /foo/path -name \? 

2 Solutions collect form web for “find: значение \? знак как значение параметра имени”

? является частью механизма, называемого «расширение имени пути» в оболочке .

Вкратце, механизм оболочки называется «глобусом». Основной глобус использует всего три символа: * ? и [ которые строят «шаблоны».

Звездочка * означает:

  • Любой символ в любом количестве (любая строка).

Вопросительный знак ( ? ) Означает:

  • Любой персонаж один раз .

Квадратные фигурные скобки определяют список символов [ ] и означают:

  • Только символы внутри списка подсчитываются один раз. Там могут существовать отрицательные списки.

Эти символы используются аналогичным образом в команде find . В поиске они называются «шаблонами».

Это означает, что существуют два объекта, которые используют одни и те же символы для выполнения одной и той же задачи (глобусы). Нужно сказать, чтобы игнорировать этих персонажей. Обычный способ сказать оболочке избежать интерпретации специальных символов – это «процитировать их». Либо «одиночные кавычки», «двойные кавычки», либо обратная косая черта:

 '?' "?" \? 

Вот почему «шаблоны» для find цитируются:

 find /path/foo -name \? 

Что означает эта линия:

Список всех файлов и каталогов, начиная с каталога /path/foo которые имеют имя только одного символа.

около /

Обратите внимание, что ? в расширении шаблона наложения может совпадать с / .

pattern в поиске может соответствовать параметру / указанному POSIX внутри раздела операндов для команды find :

-path. Первичный должен оценивать как истинный, если текущий путь соответствует шаблону с использованием обозначения соответствия шаблону, описанного в Обозначении соответствия шаблону. Дополнительные правила в шаблонах, используемых для расширения имен файлов, не применяются, поскольку это операция соответствия, а не расширение.

Опять же: дополнительные правила … для расширения имени файла (как в оболочке) не применяются, поскольку это операция соответствия, а не расширение.

Чтобы показать, что это так:

 $ mkdir test; cd test $ mkdir -pa/b/c/d $ find a -path 'a?b' a/b $ find . -path './a?b?c?d' ./a/b/c/d 

Конечно, параметр -name find будет соответствовать базовому имени файла. Это, по определению, не может иметь a / as, если невозможно совместить a / в базовом имени.

? является специальным символом в сопоставлении с образцом , который соответствует любому одиночному символу.

Таким образом, команда означает поиск всех файлов и каталогов в /foo/path и его подкаталогах, имена которых имеют ровно один символ.

\? используется, чтобы ваша оболочка не выполняла генерацию имени файла . Вы можете использовать другие механизмы цитирования :

 find /foo/path -name '?' 

или:

 find /foo/path -name "?" 

Обратите внимание, что ? в шаблонах расширения имени файла никогда не соответствует / , а также тому, что шаблон, присвоенный -name , из-за косой черты, который будет игнорироваться при вычислении basename () файла ( Базисное имя является окончательным или единственным именем файла в пути . И имя файла , в контексте пути, может сопровождаться завершающими косыми чертами):

 $ mkdir ab $ find a/ b/ -name a -o -name b\? a/ 

выводит a/ только.

Единственным исключением является / и // для реализаций, где // не ссылается на / :

 $ find / ! -path / -prune -o -name \? -print / 

( Определение POSIX немного нечетко описывает базовое имя / , // и ///+ )

или в busybox find:

 $ busybox find a/ b/ -name a -o -name b\? b/ 

Если вы попытаетесь использовать / в шаблоне, заданном для -name , то поведение зависит от реализации.

Поиск BSD и поиск реликвии считают выражение ложным, вывод ничего:

 $ find /tmp -name /tmp $ echo "$?" 0 

GNU find выдает предупреждающее сообщение:

 $ find /tmp -name /tmp find: warning: Unix filenames usually don't contain slashes (though pathnames do). That means that '-name '/tmp'' will probably evaluate to false all the time on this system. You might find the '-wholename' test more useful, or perhaps '-samefile'. Alternatively, if you are using GNU grep, you could use 'find ... -print0 | grep -FzZ '/tmp''. 

И его код возврата равен 0.

  • Регулярное выражение для проверки только чисел присутствует после подчеркивания не символов
  • Почему ls отображает несуществующий файл?
  • Почему моя находка не рекурсивна?
  • rm -rf все файлы и все скрытые файлы. & .. ошибка
  • Как использовать подстановочные знаки (*) при копировании с помощью scp?
  • Список всех текущих файлов dotfiles с помощью zsh
  • Bash захват звездочки внутри файла
  • Можно ли изменить порядок глобуса?
  • bash - extglob 2-й оператор «нуль или больше» не работает
  • Работа с именами файлов со специальными первыми символами (например, ♫)
  • Есть ли какая-нибудь причина для двойного проверки результатов `find -type -f` с помощью оператора` -f` bash?
  • Linux и Unix - лучшая ОС в мире.