Что означает. ?? * в команде оболочки?

22

Следующая команда будет tarвсе «точечные» файлы и папки:

tar -zcvf dotfiles.tar.gz .??*

Я знаком с регулярными выражениями , но не понимаю, как их интерпретировать .??*. Я выполнил ls .??*и tree .??*посмотрел на файлы, которые были перечислены. Почему это регулярное выражение включает в себя все файлы в папках, например, начиная с .?

SabreWolfy
источник
1
см. также unix.stackexchange.com/questions/1168/…
lesmana

Ответы:

32

Глобусы не являются регулярными выражениями. В общем, оболочка будет пытаться интерпретировать все, что вы вводите в командной строке, которые вы не цитируете, как глобус. Оболочки вообще не обязаны поддерживать регулярные выражения (хотя на самом деле многие из более современных более изящных делают, например, =~оператор соответствия регулярного выражения в bash [[конструкции).

Это .??*шар. Он соответствует любому имени файла, которое начинается с буквальной точки ., за которой следуют любые два (не обязательно одинаковых) символа ??, за которыми следует эквивалент регулярного выражения [^/]*, т. Е. 0 или более символов, которые не являются /.

Для получения полной информации о расширении пути к файлу (полное имя «globbing»), смотрите спецификацию POSIX .

jw013
источник
10
Дополнительный момент: это попытка написать глоб, который соответствует всем точечным файлам в каталоге, кроме специальных записей .и с ..которым обычно ничего не нужно делать. Это не совсем правильно; он не берет ничего с именем ' .X', где X - это какой-то символ, отличный от точки. Я не думаю, что можно написать один глобус, который соответствует каждому точечному файлу, кроме .и .., но вы можете сделать это с двумя: tar zcvf dotfiles.tar.gz .[!.] .??*например.
Звол
@Zack: Спасибо за разъяснения. Я написал комментарий об этом, но затем удалил его. ls .?возвратил то же самое ls .., что означало, что в папке не было других записей, соответствующих шаблону .?. Я бы сделал .[^.]для всех .?файлов, кроме ...
SabreWolfy
2
@SabreWolfy Если вы читаете спецификации POSIX тщательно, что на самом деле важное различие между комками и регулярным выражением: в скобках выражении, [^abc]в регулярных выражениях с помощью синтаксиса таких же , как [!abc]в синтаксисе Глобы (т.е. ^заменяются !на комки). Использование [^abc]синтаксиса стилей в глобе не очень переносимо, потому что POSIX не определяет, что это значит, поэтому некоторые оболочки интерпретируют его, используя семантику, подобную регулярному выражению, в то время как другие воспринимают ее ^как буквальный символ.
jw013
1
@ jw013: Спасибо за подробности. Я должен помнить, что glob! =
Регулярное
1
Мне только что пришло в голову, что в общем случае, когда нет файлов, соответствующих этому шаблону , .[!.]их можно оставить в виде литерала в tarкомандной строке. Некоторые оболочки позволяют вам контролировать это поведение, например, с помощью bash, shopt -s nullglobи оно исчезнет из командной строки, если оно ничего не соответствует, но это не универсальная функция.
Звол
8

.??*Подстановочные ( не регулярное выражение, хотя это выглядит именно так) переводит в имена файлов , которые начинаются с периода ( .), а затем двумя отдельными символами ( ??), а затем любое число (ноль или более) других символов ( *).

Может быть, эта страница подстановочных знаков в именах файлов будет полезна.

Левон
источник
-1

Чтобы добавить к другим ответам, один ?будет преобразован в имя файла с одним символом и ??будет соответствовать именам файлов, которые имеют только два символа и так далее.

[root@mercy testdir_2]# ls
ion  it  r
[root@mercy  testdir_2]# ls ?
r
[root@mercy  testdir_2]# ls ??
it
[root@mercy 1 testdir_2]# ls ???
ion
[root@mercy  testdir_2]#
Sree
источник
Downvoter, не могли бы вы прокомментировать, пожалуйста? Был бы рад исправить, если я ошибаюсь.
Сри
Ваш ответ не ответил на вопрос полностью.
SabreWolfy