Что означает звездочка, обратный слеш, двоеточие и два в (* \: 2)?

3053
jugmac00

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

ls -l *\:2,*T 
  • ls = список
  • -l = длинный (список)
  • *Tнаверное значит Tв конце

Но как насчет этого *\:2и запятой?

14

3 ответа на вопрос

25
Eugen Rieck

*\:2,*Tшаблон глобуса файлов для отображения Чтобы понять это, нам нужно запомнить несколько вещей:

  • : должен быть сброшен в оболочку, став \:
  • Имена файлов могут легко содержать запятые

Так *\:2,*Tбудет, например, соответствовать файл с именемTranscationNumber:2,EventType:XYT

РЕДАКТИРОВАТЬ

Из комментариев, необходимость (или нет) выхода из :потребности требует нескольких слов: не обязательно избегать :знака, но сам bash предлагает это при автозаполнении.

Спасибо вам, как Евгению, так и Хруйну. Я заподозрил какой-то сложный шаблон сглаживания, но на самом деле он должен просто соответствовать двоеточию и запятой, о которых я не думал при работе с файлами. Теперь команда имеет смысл: перечислить все файлы электронной почты в каталогах Maildir, которые помечены как «Удаленные» (T). Btw. Число 2 означает Maildir в версии 2 (см. Https://wiki2.dovecot.org/MailboxFormat/Maildir). jugmac00 6 лет назад 3
С каких пор `:` нужно избегать? Barmar 6 лет назад 9
`:` не нужно экранировать. Это особенное только в определенных обстоятельствах (при использовании в качестве команды), а не в шаблонах глобуса. `\:` Эквивалентно `:`, экранирование не имеет значения. terdon 6 лет назад 7
@terdon Мне было интересно, в каком случае было бы интересно иметь `\:` в качестве команды, и обнаружил, что `bash` все еще, кажется, анализирует` \: `как команду NOP. Смотрите [этот ideone] (http://ideone.com/U4GWei). Я думаю, что это было по-другому в старых версиях Bash или других оболочек? Aaron 6 лет назад 0
@ Barmar Отредактировал мой ответ, спасибо за указание на это! Eugen Rieck 6 лет назад 0
@ Аарон, это не * точно * бездействие: оболочка все равно будет обрабатывать подстановки переменных, в частности, разновидность присваивания (т. Е. Устанавливать значения по умолчанию): `unset var; : $ ; echo $ var` glenn jackman 6 лет назад 1
@Aaron Я бы не ожидал, что `\:` защитит, если его распознают как команду, поскольку это еще одна распространенная конструкция, используемая, например, для [игнорирования псевдонимов] (https://askubuntu.com/a/525242/85695 ). С другой стороны, завершение табуляции в файле, имя которого имеет `:`, приводит к `\:`. Я не знаю, почему это произойдет, но я предполагаю, что это историческое событие и что старые раковины задохнутся от этого. Я тестировал на bash, dash, tcsh и ksh, и у всех них не было проблем с `:`. Предположительно, некоторые старые снаряды сделали. terdon 6 лет назад 0
@terdon спасибо, я не знал об этом использовании обратной косой черты, я бы использовал `command` или` builtin` для достижения того же эффекта. В автозаполнении определенно есть что-то странное: я протестировал bash на Cygwin и RHEL и получил несколько странных поведений, включая упомянутое вами, невозможность завершиться сразу после `:` или, что еще хуже, завершения предложения, основанные только на части, следующей за `:` (т.е. завершение после `test: te`, предлагающее каждый файл, начинающийся с` te`). Похоже, избежать их может быть хорошей идеей. Aaron 6 лет назад 0
@terdon & @Aaron двоеточие `:` является частью значений по умолчанию для переменной среды `COMP_WORDBREAKS`. В автозаполнении Bash эти символы используются в качестве разделителей слов библиотекой строк чтения, и имя файла, содержащее двоеточие, конечно, должно быть одним словом. Следовательно, причина того, что автозаполнение bash требует экранирования двоеточия, хотя в остальном это "* главным образом *", а не специальный символ ... HBruijn 6 лет назад 1
14
HBruijn

Перечислите все файлы, которые соответствуют шаблону подстановочного знака *:2,*T

Там подстановочный знак *соответствует чему угодно (любое количество всех возможных символов)
:2,- это символы, которые должны присутствовать в именах файлов / каталогов.
Двоеточие :- это специальный символ, который необходимо экранировать, поэтому он имеет форму \:2,.
Имена файлов / каталогов должны заканчиваться на T.

Имена файлов, которые будут соответствовать, будут

:2,T a:2,T a:2,bT abbY-$fafaf:2,<hskjhsgdfhjk>T 
В этом нет ничего особенного: от него не нужно убегать. Kevin 6 лет назад 1
Автоматическое завершение @Kevin bash автоматически исключает двоеточие в шаблонах имен файлов / каталогов, поскольку включено в список значений среды `COMP_WORDBREAK`, которые устанавливаются по умолчанию. - Таким образом, это действительно не специальный специальный символ, но когда вы используете автозаполнение в командной строке и хотите / должны сопоставлять имена файлов с двоеточием, его нужно экранировать. HBruijn 6 лет назад 0
9
Ángel

Как отметили другие, это будет список в длинном формате, файлы, содержащие :2и заканчивающиеся наT

Это похоже на поиск в папке Maildir файлов, которые были удалены (удалены). Однако для надежности у него должен был быть другой *в конце. Могут быть добавлены новые флаги с более поздней алфавитной позицией, и Dovecot, например, добавляет другое поле с размером файла в конце.