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

  • Mikä tämä hahmo on? ɀ?
  • Mikä bash-versio, millä alustalla? En voi ' t toistaa tätä bash 4.2.37: llä Debianin vinkuvalla tai bash 4.1.5: llä Debian-puristuksella. @slm unicode ɀ tai Wikipedia
  • @Gilles Onko tämä kehote?
  • slm, kyllä! ɀ 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 – )
  • " GNU bash, versio 3.2.53 (1) -julkaisu (x86_64-apple-darwin13) " toimitettu OS X 10.9: n kanssa on tällainen.

Vastaa

Luulen, että tämä viittaa vain alihakemistotasoon. . ** ilman / vastaa

  1. kaikkia tiedostoja ja hakemistoja

  2. 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.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *