Mám tuto adresářovou strukturu:

~/tmp/globstar ɀ find dir -type f dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext 

a s globstar možnost povolena v Bash, mohu říci:

~/tmp/globstar ɀ ls -1 dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext 

Moje otázka zní: proč je dir/file.ext vyloučeni z tohoto seznamu?

Bash manuál to říká o globstar:

Pokud je nastaven, vzor ** použitý v kontextu rozšíření názvu souboru bude odpovídat všem souborům a nulovému nebo více adresářům a podadresářům. Pokud za vzorem následuje znak „/“, shodují se pouze adresáře a podadresáře.

nula ”v tomto odstavci mám dojem, že dir/file.ext měl být zahrnut; ledaže mi něco chybí.

Komentáře

  • Co je to za znak? ɀ?
  • Jaká verze bash, na jaké platformě? Nemohu to ' reprodukovat pomocí bash 4.2.37 na Debianu s pískáním nebo bash 4.1.5 na Debianu squeeze. @slm unicode ɀ nebo Wikipedia
  • @Gilles Je to výzva?
  • slm, ano! ɀ je pouze znak, který se zde používá k rozlišení výzvy. Někteří uživatelé dávají přednost £ nebo místo $ :). Původně ɀ a ' z ' znak vytvořený pro speciální notaci v africkém jazyce: – )
  • " GNU bash, verze 3.2.53 (1) -release (x86_64-apple-darwin13) " toto chování je dodáváno s OS X 10.9.

Odpověď

Myslím, že to odkazuje pouze na úroveň podadresáře . ** bez / shody

  1. všechny soubory a adresáře

  2. nula nebo více podadresářů

Ale úplně nezmizí. **/ znamená, že se neshodují žádné soubory v adresáři nejvyšší úrovně, na které se ** vztahuje.

Musíte dir/*.ext dir/**/*.ext.

Komentáře

  • Jo, to je přesně moje záložní řešení, prostě to nevypadá hezky. 😉

Odpověď

Funguje to podle očekávání v těchto verzích Bash dodávaných s uvedenými distribucemi :

  • 4.1.2 (1) – CentOS 6.5
  • 4.1.5 (1) – Debian 6.0.10
  • 4.1.10 (4 ) – Cygwin 1.7.31
  • 4.2.46 (1) – CentOS 7.1
  • 4.3.11 (1) – Ubuntu 14.04.1
  • 4.3.30 (1) – Debian 8.1

Ve skutečnosti jsou výše uvedené verze všechny, které jsem testoval. Jinými slovy jsem nenašel verzi 4 Bash, kde nefunguje. Možnost globstar byla přidána do Bash 4.0 viz ZMĚNY . Ve starších verzích by měl příkaz shopt -s globstar vrátit chybu.

Testy

1 . dir/**/*.ext odpovídá dir/file.ext:

~/tests$ ls -1 dir/**/*.ext dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext 

2. **/*.ext odpovídá file.ext:

~/tests$ cd dir ~/tests/dir$ ls -1 **/*.ext file.ext subdir1/file.ext subdir2/file.ext 

Příprava prostředí pro reprodukci výše uvedených testů:

mkdir -p dir/subdir{1,2} touch dir/{,subdir{1,2}/}file.ext shopt -s globstar 

Komentáře

  • toto je správná odpověď. OP zapomněl nastavit shopt -s globstar.

Odpovědět

I vypadá na mě, jako bys měl / měl vypnutý globstar. Lze jej zapnout takto:

shopt -s globstar 

Nejen, že nebude odpovídat nulovým podadresářům, ale nebude odpovídat ani dvěma podadresářům:

$ find dir -type f #the same as yours except with a directory inside one of the subdirectories dir/file.ext dir/subdir1/file.ext dir/subdir1/subsubdir/file.ext dir/subdir2/file.ext $ shopt -u globstar #turn globstar off $ #will only show files in subdirectories $ #will not show files in dir or in subsubdir $ echo dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext $ shopt -s globstar #turn globstar on $ #will show all four files $ echo dir/**/*.ext dir/file.ext dir/subdir1/file.ext dir/subdir1/subsubdir/file.ext dir/subdir2/file.ext 

Když je globstar vypnutý, ** se bude chovat stejně jako *, takže dir/**/*.ext získá stejný výsledek jako dir/*/*.ext

$ echo dir/*/*.ext dir/subdir1/file.ext dir/subdir2/file.ext 

který mě někdy přiměje myslet si, že globstar je zapnutý

zkontrolujte aktuální nastavení globstar jako toto:

shopt | grep globstar 

Komentáře

  • Nastavení možností prostředí můžete zkontrolovat přímo, jako v shopt globstar.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *