Что означает звездочка, обратный слеш, двоеточие и два в (* \: 2)?
3104
jugmac00
В чем смысл следующей lsкоманды?
ls -l *\:2,*T
ls = список
-l = длинный (список)
*Tнаверное значит Tв конце
Но как насчет этого *\:2и запятой?
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 7 лет назад
3
С каких пор `:` нужно избегать?
Barmar 7 лет назад
9
`:` не нужно экранировать. Это особенное только в определенных обстоятельствах (при использовании в качестве команды), а не в шаблонах глобуса. `\:` Эквивалентно `:`, экранирование не имеет значения.
terdon 7 лет назад
7
@terdon Мне было интересно, в каком случае было бы интересно иметь `\:` в качестве команды, и обнаружил, что `bash` все еще, кажется, анализирует` \: `как команду NOP. Смотрите [этот ideone] (http://ideone.com/U4GWei). Я думаю, что это было по-другому в старых версиях Bash или других оболочек?
Aaron 7 лет назад
0
@ Barmar Отредактировал мой ответ, спасибо за указание на это!
Eugen Rieck 7 лет назад
0
@ Аарон, это не * точно * бездействие: оболочка все равно будет обрабатывать подстановки переменных, в частности, разновидность присваивания (т. Е. Устанавливать значения по умолчанию): `unset var; : $ ; echo $ var`
glenn jackman 7 лет назад
1
@Aaron Я бы не ожидал, что `\:` защитит, если его распознают как команду, поскольку это еще одна распространенная конструкция, используемая, например, для [игнорирования псевдонимов] (https://askubuntu.com/a/525242/85695 ). С другой стороны, завершение табуляции в файле, имя которого имеет `:`, приводит к `\:`. Я не знаю, почему это произойдет, но я предполагаю, что это историческое событие и что старые раковины задохнутся от этого. Я тестировал на bash, dash, tcsh и ksh, и у всех них не было проблем с `:`. Предположительно, некоторые старые снаряды сделали.
terdon 7 лет назад
0
@terdon спасибо, я не знал об этом использовании обратной косой черты, я бы использовал `command` или` builtin` для достижения того же эффекта. В автозаполнении определенно есть что-то странное: я протестировал bash на Cygwin и RHEL и получил несколько странных поведений, включая упомянутое вами, невозможность завершиться сразу после `:` или, что еще хуже, завершения предложения, основанные только на части, следующей за `:` (т.е. завершение после `test: te`, предлагающее каждый файл, начинающийся с` te`). Похоже, избежать их может быть хорошей идеей.
Aaron 7 лет назад
0
@terdon & @Aaron двоеточие `:` является частью значений по умолчанию для переменной среды `COMP_WORDBREAKS`. В автозаполнении Bash эти символы используются в качестве разделителей слов библиотекой строк чтения, и имя файла, содержащее двоеточие, конечно, должно быть одним словом. Следовательно, причина того, что автозаполнение bash требует экранирования двоеточия, хотя в остальном это "* главным образом *", а не специальный символ ...
HBruijn 7 лет назад
1
14
HBruijn
Перечислите все файлы, которые соответствуют шаблону подстановочного знака *:2,*T
Там подстановочный знак *соответствует чему угодно (любое количество всех возможных символов) :2,- это символы, которые должны присутствовать в именах файлов / каталогов. Двоеточие :- это специальный символ, который необходимо экранировать, поэтому он имеет форму \:2,. Имена файлов / каталогов должны заканчиваться на T.
Имена файлов, которые будут соответствовать, будут
:2,T a:2,T a:2,bT abbY-$fafaf:2,<hskjhsgdfhjk>T
В этом нет ничего особенного: от него не нужно убегать.
Kevin 7 лет назад
1
Автоматическое завершение @Kevin bash автоматически исключает двоеточие в шаблонах имен файлов / каталогов, поскольку включено в список значений среды `COMP_WORDBREAK`, которые устанавливаются по умолчанию. - Таким образом, это действительно не специальный специальный символ, но когда вы используете автозаполнение в командной строке и хотите / должны сопоставлять имена файлов с двоеточием, его нужно экранировать.
HBruijn 7 лет назад
0
9
Ángel
Как отметили другие, это будет список в длинном формате, файлы, содержащие :2и заканчивающиеся наT
Это похоже на поиск в папке Maildir файлов, которые были удалены (удалены). Однако для надежности у него должен был быть другой *в конце. Могут быть добавлены новые флаги с более поздней алфавитной позицией, и Dovecot, например, добавляет другое поле с размером файла в конце.