2010-08-20 6 views
21

В Ryan Bates' Railscast about git, его .gitignore файл содержит следующую строку:Unix подстановочные знаки? (Звездочки)

tmp/**/*

Какова цель использования двойных звездочками отмечены звездочкой, как, например: **/*? Использовал бы просто tmp/* вместо tmp/**/* не достигнет такого же результата?

В связи с проблемой, я нашел неясную статью IBM об этом, и мне было интересно, может ли кто-нибудь прояснить проблему.

+0

Примечание: хотя некоторые оболочки поддерживают этот синтаксис, Git этого не делает. В файле '.gitignore' это эквивалентно' tmp/*/* '. – hammar

ответ

24

Сообщается, что он входит во все подкаталоги под таблицей tmp, а также только содержимое tmp.

например. У меня есть следующие:

$ find tmp 
tmp 
tmp/a 
tmp/a/b 
tmp/a/b/file1 
tmp/b 
tmp/b/c 
tmp/b/c/file2 

соответствует выход:

$ echo tmp/* 
tmp/a tmp/b 

соответствует выход:

$ echo tmp/**/* 
tmp/a tmp/a/b tmp/a/b/file1 tmp/b tmp/b/c tmp/b/c/file2 

Это функция по умолчанию Zsh, чтобы заставить его работать в Баш 4 вы :

shopt -s globstar 
+1

отличное объяснение. благодаря! –

+0

Есть ли номенклатура для такого соответствия шаблону в Unix? Я пытаюсь найти больше информации, и я не знаю, как это сделать в Google. – Jondlm

+0

Подбор шаблонов для файлов называется подталкиванием. Основными вариантами являются '*' для 0 или более символов, '?' Для любого символа и '[CharacterRange]' для символов, соответствующих определенному диапазону, например. '[0-9]' для соответствия цифры. Некоторые оболочки распространяют его по-своему, включая синтаксис '**'. – Petesh

5

От http://blog.privateergroup.com/2010/03/gitignore-file-for-android-development/:

(kwoods)

"The double asterisk (**) is not a git thing per say, it’s really a linux/Mac shell thing. 

It would match on everything including any sub folders that had been created. 

You can see the effect in the shell like so: 

# ls ./tmp/* = should show you the contents of ./tmp (files and folders) 
# ls ./tmp/** = same as above, but it would also go into each sub-folder and show the contents there as well." 
1

Согласно the documentation of gitignore, этот синтаксис поддерживается начиная с версии 1.8.2 мерзавца.

Вот соответствующий раздел:

Два последовательных звездочками (**) в образцах сопоставляется полное имя пути может иметь особое значение:

  • Ведущий ** через слэш означает матч все каталоги. Например, **/foo соответствует файлу или каталогу foo в любом месте, такой же, как у шаблона foo. **/foo/bar соответствует файлу или каталогу bar где угодно, что находится под каталогом foo.

  • A trailing /** соответствует всем требованиям внутри. Например, abc/** соответствует всем файлам внутри каталога abc, относительно файла .gitignore с бесконечной глубиной.

  • Слэш, за которым следуют две последовательные звездочки, затем косая черта совпадает с нулевыми или более каталогами. Например, a/**/b соответствует a/b, a/x/b, a/x/y/b и так далее.

  • Другие последовательные звездочки считаются недействительными.

Смежные вопросы