Что означает вопросительный знак в терминальной команде?

Ответы:

15

Они называются подстановочными знаками

Стандартные подстановочные знаки (также называемые шаблонами глобализации) используются различными утилитами командной строки для работы с несколькими файлами.
Стандартные подстановочные знаки используются практически любой командой (включая mv, cp, rm и многие другие).

  • (question mark)

    это может представлять любой отдельный символ. Если вы указали что-то в командной строке, как "hd?" GNU / Linux будет искать hda, hdb, hdc и любую другую букву / цифру между az, 0-9.

  • *(asterisk)

    это может представлять любое количество символов (включая ноль, другими словами, ноль или более символов). Если вы указали «cd *», он будет использовать «cda», «cdrom», «cdrecord» и все, что начинается с «cd», включая сам «cd». «m * l» может означать мельницу, мулл, мл и все, что начинается с m и заканчивается l.

  • [ ] (square brackets)

    указывает диапазон. Если вы сделали m [a, o, u] m, он может стать: mam, mum, mom, если вы сделали: m [ad] m, он может стать всем, что начинается и заканчивается m и имеет любой символ от a до d между ними. Например, это будет работать: мам, мбм, мсм, мдм. Этот тип подстановочных знаков указывает отношение «или» (вам нужен только один для сопоставления).

  • { } (curly brackets)

    термины разделены запятыми, и каждый термин должен быть именем чего-либо или подстановочным знаком. Этот подстановочный знак будет копировать все, что соответствует либо подстановочным знакам (символам), либо точному имени (ям) (отношение «или», одно или другое).


Например, это будет правильно:

  • cp { .doc, .pdf} ~

    Это скопирует все, что заканчивается на .doc или .pdf, в домашний каталог пользователей. Обратите внимание, что пробелы не допускаются после запятых (или где-либо еще).

  • [!]

    Эта конструкция аналогична конструкции [], за исключением того, что вместо совпадения с любыми символами в скобках она будет соответствовать любому символу, если она не указана между [и]. Это логическое НЕ. Например, rm myfile [! 9] удалит все myfiles * (т.е. myfiles1, myfiles2 и т. Д.), Но не удалит файл с номером 9 в любом месте его имени.

  • \ (backslash)

    используется в качестве символа «escape», т.е. для защиты последующего специального символа. Таким образом, «\» выполняет поиск обратной косой черты. Обратите внимание, что вам может понадобиться использовать кавычки и обратную косую черту.

для большего количества примеров: посетите эту страницу

зарегистрированный пользователь
источник
3
Стоит отметить, что apt-get removeтребуются имена пакетов , а не имена файлов, что делает расширение подстановочного знака в оболочке в значительной степени бесполезным. Если вы хотите удалить диапазон пакетов, вам нужно использовать полное регулярное выражение, заключенное в соответствующие кавычки, чтобы оболочка не пыталась интерпретировать его как глобус (например apt-get remove 'gnome.*').
4
Standard wildcards are used by nearly any command (including mv, cp, rm and many others).=> ЛОЖЬ. эти подстановочные знаки расширяются оболочкой, и команда получает результат расширения (т. е. файлы, соответствующие шаблону) вместо шаблона. (если нет файла, соответствующего шаблону, тогда этот шаблон будет передан непосредственно в команду)
Карлос Кампдеррос
17

Вообще говоря, в Bash a ?- это шаблон глобуса, который расширяется до произвольного символа.

Например:

$ echo Hello1 > foo1
$ echo Hello2 > foo2
$ cat foo?
Hello1
Hello2

Это сродни a *, но *расширение расширяется до 0 или более символов, в то время как ?расширение расширяется до ровно одного (произвольного) символа.

Хотя в вашем особом случае ?команда была явно опечаткой.

Malte Skoruppa
источник
Так что это бесполезно / ненужно в моем случае, верно?
Ooker
Да. Фактически это было отредактировано из ответа, с которым вы связались, когда задали свой вопрос. :)
Malte Skoruppa
1
Не могу поверить: -o
Ooker
1
Даже если они были правильными подстановочными знаками, этого использования следует избегать без цитирования. apt-get понимать RE, но если gnome1в текущем каталоге существует файл с именем , оболочка раскроет его, прежде чем apt-get сможет его увидеть.
Rmano
@Ooker Ты никогда не забудешь это сейчас!
товарищем