Minulla on tämä hakemistorakenne:
~/tmp/globstar ɀ find dir -type f dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext
ja globstar
-vaihtoehto on käytössä Bashissa, voin sanoa:
~/tmp/globstar ɀ ls -1 dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext
Kysymykseni on: miksi dir/file.ext
suljettiin pois tästä luettelosta?
Bash-käsikirja kertoo tämän globstar
:
Jos asetus on asetettu, tiedostonimen laajennuskontekstissa käytetty kuvio ** vastaa kaikkia tiedostoja ja nollaa tai useampaa hakemistoa ja alihakemistoa. Jos mallin jälkeen on /, vain hakemistot ja alihakemistot vastaavat toisiaan.
” nolla ”antaa minulle vaikutelman, että dir/file.ext
olisi pitänyt sisällyttää; ellei toivottavasti puuttuu jotain.
Kommentit
Vastaa
Luulen, että tämä viittaa vain alihakemistotasoon. . **
ilman /
vastaa
-
kaikkia tiedostoja ja hakemistoja
-
nolla tai useampia alihakemistoja
Mutta se ei katoa kokonaan. **/
tarkoittaa, että yhtään tiedostoa korkeimman tason hakemistossa, jota **
koskee, ei löydy.
Tarvitset dir/*.ext dir/**/*.ext
.
Kommentit
- Joo, se on täsmälleen varani, se ei vain näytä hyvältä. 😉
vastaus
Tämä toimii odotetulla tavalla näissä Bash-versioissa lueteltujen jakelujen mukana :
- 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
Itse asiassa yllä luetellut versiot ovat kaikki testattujani. Toisin sanoen en löytänyt Bashin versiota 4, jossa se ei toimi. Vaihtoehto globstar
lisättiin Bash 4.0: een, katso MUUTOKSET . Vanhemmissa versioissa komennon shopt -s globstar
pitäisi palauttaa virhe.
Testit
1 . dir/**/*.ext
vastaa dir/file.ext
:
~/tests$ ls -1 dir/**/*.ext dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext
2. **/*.ext
vastaa file.ext
:
~/tests$ cd dir ~/tests/dir$ ls -1 **/*.ext file.ext subdir1/file.ext subdir2/file.ext
Ympäristön valmistelu yllä olevien testien toistamiseksi:
mkdir -p dir/subdir{1,2} touch dir/{,subdir{1,2}/}file.ext shopt -s globstar
kommentit
- tämä on oikea vastaus. OP unohti asettaa
shopt -s globstar
.
Vastaa
I näyttää minulta kuin sinulla olisi / olisit ottanut globstar-virran pois päältä. Se voidaan ottaa käyttöön tällä tavalla:
shopt -s globstar
Se ei vain sovi nollaan alihakemistoon, mutta se ei sovi myöskään kahteen alihakemistoon:
$ 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
Kun globstar on pois päältä, ** käyttäytyy samalla tavalla kuin *, joten dir/**/*.ext
saa saman tuloksen kuin dir/*/*.ext
$ echo dir/*/*.ext dir/subdir1/file.ext dir/subdir2/file.ext
joka joskus huijaa minua ajattelemaan, että globstar on päällä
tarkista nykyinen globstar-asetuksesi kuten tämä:
shopt | grep globstar
Kommentit
- Voit tarkistaa komentoasetuksen suoraan, kuten kohdassa
shopt globstar
.
ɀ
?unicode ɀ
tai Wikipediaɀ
on vain merkki, jota käytetään tässä erottamaan kehote. Jotkut käyttäjät suosivat merkkiä£
tai€
$
🙂 -merkin sijaan. Alun perinɀ
a ' z ' merkki, joka luotiin erityistä afrikkalaista kielimerkintää varten – )