Путаница буквальная точка, скопировать все скрытые файлы

Он прекрасно работает, когда я копирую все скрытые файлы с помощью регулярных выражений:

cp -r source/\.[^.]* destination/

и просто копирует именно те файлы, которые начинаются с точки ..

Однако я обнаружил следующее работает также:

cp -r source/.[^.]* destination/

В регулярном выражении точка . не означает «какой-либо особый символ»? Так почему же вторая команда не копирует обычные файлы (не скрытые)?
Почему точка . интерпретируется буквально в команде cp?

1
задан 31 July 2012 в 23:24

2 ответа

cp, как и остальные встроенные команды оболочки, принимают и расширяют глобальные паттерны , а не регулярные выражения. Они похожи в некоторых аспектах, различны во многих. Например, . буквально в глобусах, а любой отдельный символ соответствует ?.

Ваш друг в этом случае man 7 glob.

0
ответ дан 31 July 2012 в 23:24

Bash вообще не использует регулярные выражения, он использует свои собственные правила для раскрытия с помощью подстановочных знаков (называемых «globbing». Точка - это просто символ, а символ «^» отрицает все, что следует далее, поэтому первый пример соответствует файлам начиная с точки, за которой не следует вторая точка, и следующая делает то же самое; нет необходимости избегать точки, но она все равно принимается.

Правка: После просмотра предложенного «man 7» glob "от Marios, я ошибся, я думаю, насчет символа '^'. Кажется, говорят, что [^.] будет неопределенным, а не не символом. Bash использует восклицательный знак для отрицания.

0
ответ дан 31 July 2012 в 23:24

Другие вопросы по тегам:

Похожие вопросы: