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


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

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

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

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

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

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


1
2017-07-31 18:43


происхождения


Но оболочка bash не использует регулярные выражения, она использует свои собственные правила расширения. - Marty Fried
С Zsh вы не получаете «..» и «.» когда вы делаете ". *" :) - Janus Troelsen


ответы:


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

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


7
2017-07-31 19:05





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

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


1
2017-07-31 19:11



Да, большое спасибо. - LYg
О, я действительно мало что знал о том, как глотать, ваш комментарий предостерег меня от большой разницы между glob и regex. Мне кажется, мне нужно много работы по чтению, спасибо. - LYg