Ik heb deze directory-structuur:

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

en, met de globstar optie ingeschakeld in Bash, ik kan zeggen:

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

Mijn vraag is: waarom is dir/file.ext uitgesloten van deze lijst?

Bash-handleiding zegt dit over globstar:

Indien ingesteld, zal het patroon ** dat wordt gebruikt in een bestandsnaamuitbreidingscontext overeenkomen met alle bestanden en nul of meer mappen en submappen. Als het patroon wordt gevolgd door een /, komen alleen mappen en submappen overeen.

nul “in deze paragraaf laat me de indruk hebben dat dir/file.ext had moeten worden opgenomen; tenzij ik hopelijk iets mis.

Reacties

  • Wat is dit karakter? ɀ?
  • Welke versie van bash, op welk platform? Ik kan dit ' niet reproduceren met bash 4.2.37 op Debian-wheezy of bash 4.1.5 op Debian-squeeze. @slm unicode ɀ of Wikipedia
  • @Gilles Is dat een prompt?
  • slm, ja! ɀ is slechts een teken dat hier wordt gebruikt om de prompt te onderscheiden. Sommige gebruikers geven de voorkeur aan het teken £ of in plaats van $ :). Oorspronkelijk was ɀ een ' z ' teken gemaakt voor een speciale Afrikaanse taalnotatie: – )
  • " GNU bash, versie 3.2.53 (1) -release (x86_64-apple-darwin13) " geleverd met OS X 10.9 vertoont dit gedrag.

Antwoord

Ik denk dat dat alleen verwijst naar het subdirectory-niveau . ** zonder / overeenkomsten

  1. alle bestanden en mappen

  2. nul of meer submappen

Maar het verdwijnt niet helemaal. **/ betekent dat er geen bestanden in de directory op het hoogste niveau worden gevonden waarop ** van toepassing is.

Je hebt dir/*.ext dir/**/*.ext.

Reacties

  • Ja, dat is precies mijn terugval, het ziet er gewoon niet mooi uit. 😉

Answer

Dit werkt zoals je verwachtte in deze versies van Bash zoals geleverd met de vermelde distributies :

  • 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

In feite zijn de bovenstaande versies alles wat ik heb getest. Met andere woorden: ik heb geen versie 4 van Bash gevonden waar het niet werkt. De optie globstar is toegevoegd in Bash 4.0, zie WIJZIGINGEN . In oudere versies zou het commando shopt -s globstar een fout moeten retourneren.

Tests

1 . dir/**/*.ext komt overeen met dir/file.ext:

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

2. **/*.ext komt overeen met file.ext:

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

De omgeving voorbereiden voor het reproduceren van bovenstaande tests:

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

Reacties

  • dit is de correct antwoord. Het OP vergat shopt -s globstar in te stellen.

Antwoord

I lijkt me alsof je globstar hebt / had uitgeschakeld. Het kan als volgt worden ingeschakeld:

shopt -s globstar 

Het komt niet alleen niet overeen met nul submappen, maar het komt ook niet overeen met twee submappen:

$ 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 

Met globstar uitgeschakeld, ** gedraagt zich uiteindelijk net als *, dus dir/**/*.ext krijgt hetzelfde resultaat als dir/*/*.ext

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

waardoor ik soms denk dat globstar aan staat

controleer je huidige globstar-instelling zoals this:

shopt | grep globstar 

Reacties

  • Je kunt een shell-optie-instelling direct controleren, zoals in shopt globstar.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *