2010-08-20 14 views
21

W Ryan Bates' Railscast about git jego .gitignore plik zawiera następujący wiersz:Unixowe selektory wieloznaczne? (Gwiazdki)

tmp/**/*

Jaki jest cel stosowania podwójnych gwiazdki następnie gwiazdką jako takie: **/*? Używając po prostu tmp/* zamiast tmp/**/*, nie osiągniesz dokładnie tego samego wyniku?

W tym artykule znalazłem niejasny artykuł o IBM i zastanawiałem się, czy ktoś mógłby wyjaśnić tę kwestię.

+0

Uwaga: Chociaż niektóre powłoki obsługują tę składnię, Git nie. W pliku '.gitignore' jest to odpowiednik' tmp/*/* '. – hammar

Odpowiedz

24

Mówi, aby przejść do wszystkich podkatalogów poniżej tmp, a także tylko zawartość tmp.

np. Mam następujący:

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

dopasowane wyjściowa:

$ echo tmp/* 
tmp/a tmp/b 

dopasowane wyjściowa:

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

Jest to funkcja domyślna zsh, aby zmusić go do pracy w bash 4, Państwo wykonać:

shopt -s globstar 
+1

świetne wyjaśnienie. dzięki! –

+0

Czy istnieje nazewnictwo dla tego rodzaju dopasowywania wzorca w systemie Unix? Próbuję znaleźć więcej informacji i nie wiem, jak to zrobić w Google. – Jondlm

+0

Dopasowywanie wzorców dla plików nazywa się globbing. Podstawowe warianty to '*' dla 0 lub więcej znaków, '?' Dla dowolnego znaku i '[CharacterRange]' dla znaków pasujących do określonego zakresu np. '[0-9]', aby dopasować cyfrę. Niektóre powłoki rozszerzają ją na swój własny sposób, co obejmuje składnię '**'. – Petesh

5

Od 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

Według the documentation of gitignore ta składnia jest obsługiwana od git wersji 1.8.2.

Oto odpowiedniej części:

dwa kolejne koła łańcuchowe (**) we wzorach porównywane pełnej ścieżki mogą mieć szczególne znaczenie:

  • Wiodący ** następnie ukośnikiem oznacza dopasowanie w wszystkie katalogi. Na przykład **/foo pasuje do pliku lub katalogu foo gdziekolwiek, to samo co wzór foo. **/foo/bar dopasowuje plik lub katalog bar w dowolnym miejscu bezpośrednio pod katalogiem foo.

  • Końcowy /** dopasowuje wszystko do środka. Na przykład abc/** pasuje do wszystkich plików w katalogu abc, w odniesieniu do lokalizacji pliku .gitignore, o nieskończonej głębokości.

  • Ukośnik, po którym następują dwie kolejne gwiazdki, a następnie kreska dopasowuje zero lub więcej katalogów. Na przykład a/**/b pasuje do a/b, a/x/b, a/x/y/b i tak dalej.

  • Kolejne gwiazdki są uważane za nieważne.