Он прекрасно работает, когда я копирую все скрытые файлы с помощью регулярных выражений:
cp -r source/\.[^.]* destination/
и просто копирует именно те файлы, которые начинаются с точки .
.
Однако я обнаружил следующее работает также:
cp -r source/.[^.]* destination/
В регулярном выражении точка .
не означает «какой-либо особый символ»? Так почему же вторая команда не копирует обычные файлы (не скрытые)?
Почему точка .
интерпретируется буквально в команде cp
?
cp
, как и остальные встроенные команды оболочки, принимают и расширяют глобальные паттерны , а не регулярные выражения. Они похожи в некоторых аспектах, различны во многих. Например, .
буквально в глобусах, а любой отдельный символ соответствует ?
.
Ваш друг в этом случае man 7 glob
.
Bash вообще не использует регулярные выражения, он использует свои собственные правила для раскрытия с помощью подстановочных знаков (называемых «globbing». Точка - это просто символ, а символ «^» отрицает все, что следует далее, поэтому первый пример соответствует файлам начиная с точки, за которой не следует вторая точка, и следующая делает то же самое; нет необходимости избегать точки, но она все равно принимается.
Правка: После просмотра предложенного «man 7» glob "от Marios, я ошибся, я думаю, насчет символа '^'. Кажется, говорят, что [^.]
будет неопределенным, а не не символом. Bash использует восклицательный знак для отрицания.