Що означає знак питання в термінальній команді?


Відповіді:


15

Вони називаються Wildcards (глобальні візерунки)

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

  • (question mark)

    це може представляти будь-який окремий символ. Якщо ви вказали щось у командному рядку типу "hd?" GNU / Linux шукає hda, hdb, hdc та будь-яку іншу літеру / цифру між az, 0-9.

  • *(asterisk)

    це може представляти будь-яку кількість символів (включаючи нуль, іншими словами, нуль або більше символів). Якщо ви вказали "cd *", він використовував би "cda", "cdrom", "cdrecord" і все, що починається з "cd", включаючи сам "cd". "m * l" міг би млин, мул, мл і все, що починається з m і закінчується a l.

  • [ ] (square brackets)

    задає діапазон. Якщо ви зробили m [a, o, u] m, вона може стати: мама, мама, мама, якщо ви зробили: m [ad] m, вона може стати будь-чим, що починається і закінчується м і має будь-який символ a до d між. Наприклад, це спрацювало б: mam, mbm, mcm, mdm. Цей тип підстановки визначає "чи" відносини (вам потрібен лише один).

  • { } (curly brackets)

    Терміни розділені комами, і кожен термін повинен бути назвою чогось або символом. Цей підстановочний код буде копіювати будь-що, що відповідає або знакам, або точним іменам (відносинам "або", тим чи іншим).


Наприклад, це було б дійсно:

  • cp { .doc, .pdf} ~

    Це скопіює все, що закінчується .doc або .pdf, у домашній каталог користувачів. Зауважте, що пропуски після коми (або деінде) заборонені.

  • [!]

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

  • \ (backslash)

    використовується як символ "втечі", тобто для захисту наступного спеціального символу. Таким чином, "\" здійснює пошук зворотної косої риски. Зверніть увагу, що вам може знадобитися використання лапок та зворотньої косої риси.

для додаткових прикладів: відвідайте цю сторінку


3
Варто згадати, що apt-get removeпотрібні назви пакетів , а не назви файлів, що робить розширення шаблону оболонкою в значній мірі марним. Якщо ви хочете видалити діапазон пакунків, вам потрібно використовувати повний регулярний вираз, цитований належним чином, щоб оболонка не намагалася інтерпретувати його як глобус (наприклад apt-get remove 'gnome.*').

4
Standard wildcards are used by nearly any command (including mv, cp, rm and many others).=> ЛАЖНА. ці шаблони розширюються оболонкою, і те, що отримує команда, є результатом розширення (тобто файлів, що відповідають шаблону) замість шаблону. (якщо немає жодного файлу, що відповідає шаблону, тоді цей шаблон буде переданий безпосередньо команді)
Carlos Campderrós,

17

Взагалі, в Bash, a ?- це глобальна модель, яка розширюється до довільного характеру.

Наприклад:

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

Він схожий на a *, але *розширюється на 0 і більше символів, тоді як ?розширюється на точно один (довільний) символ.

У вашому спеціальному випадку, ?команда, мабуть, була помилковою.


Так що в моєму випадку це марно / непотрібно, правда?
Окер

Так. Насправді це було відредаговано з відповіді, з якою ви зв'язалися, коли ви задали своє запитання. :)
Malte Skoruppa

1
Не можу повірити: -o
Ooker

1
Навіть якщо вони були правильними символами, цього використання слід уникати без цитування. apt-get зрозуміти REs, але якщо файл, який називається, gnome1існує в поточному каталозі, оболонка розширить його, перш ніж apt-get мав шанс побачити його.
Рмано

@Ooker Ви ніколи цього не забудете!
comrademike
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.