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
Odpověď
Myslím, že to odkazuje pouze na úroveň podadresáře . **
bez /
shody
-
všechny soubory a adresáře
-
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
.
ɀ
?unicode ɀ
nebo Wikipediaɀ
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: – )