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.

  • Bash Wildcard Partial Match Directory
  • Расширение имени файла с диапазонов дат
  • Поиск файлов с использованием ls и подстановочных знаков
  • Это ? особым образом обрабатывается при расширении параметров?
  • Shell globbing без совпадающих файлов
  • Удалите все файлы, кроме двух
  • Как заставить tar-манипулировать работой с опцией «change directory»
  • rm -rf все файлы и все скрытые файлы. & .. ошибка
  • Список только обычных файлов (но не каталогов) в текущем каталоге
  • Результат echo * и echo. *
  • Cygwin использует подстановочный знак для обрезания всех изображений
  • Interesting Posts

    Samson Meteor Mic под Linux / ALSA

    Iptables не форвардный трафик

    Почему этот двоичный файл передается поверх «ssh -t», который изменяется?

    Экранирование строк в ассоциативных массивах (bash)

    "Предупреждение! Вторичный раздел перекрывает последний раздел x-блоками «в gdisk, безопасно ли здесь использовать gdisk?

    Есть ли недостаток в удалении всех сломанных символических ссылок в системе?

    Проблема диапазона Sed, если последний шаблон не встречен

    Используйте iptable, чтобы перенаправить весь HTTP-трафик на localhost

    Проблема пунктуации с использованием grep для получения n слов вокруг токена

    Как выполнить обратный поиск истории в vi-режиме ZSH?

    Модель безопасности Yum ИЛИ Почему враждебный прокси может отказываться от обновлений без предупреждения?

    Ошибка установки Solaris jdk 7 java -version Нет такого файла или каталога

    Может ли Debian 8 подключиться к Интернету за моей спиной?

    Извлеките закладки из pdf и добавьте их в другой в gs?

    Читатели PDF не основаны на poppler?

    Linux и Unix - лучшая ОС в мире.