Jag har den här katalogstrukturen:

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

och, med globstar alternativet aktiverat i Bash, jag kan säga:

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

Min fråga är: varför är dir/file.ext utesluten från den här listan?

Bash manual säger detta om globstar:

Om inställt kommer mönstret ** som används i ett filnamnsexpansionskontext att matcha alla filer och noll eller fler kataloger och underkataloger. Om mönstret följs av ett /, matchar endast kataloger och underkataloger.

noll ”i detta stycke låt mig få intrycket att dir/file.ext borde ha inkluderats; såvida jag inte förhoppningsvis saknar något.

Kommentarer

  • Vad är det här karaktären? ɀ?
  • Vilken version av bash, på vilken plattform? Jag kan ' t reproducera detta med bash 4.2.37 på Debian wheezy eller bash 4.1.5 på Debian squeeze. @slm unicode ɀ eller Wikipedia
  • @Gilles Är det en uppmaning?
  • slm, ja! ɀ är bara ett tecken som används här för att urskilja prompten. Vissa användare föredrar tecknet £ eller istället för $ :). Ursprungligen skapades ɀ a ' z ' för en speciell afrikansk språknotation: – )
  • " GNU bash, version 3.2.53 (1) -release (x86_64-apple-darwin13) " levereras med OS X 10.9 har detta beteende.

Svar

Jag antar att det bara refererar till underkatalognivån . ** utan / matchar

  1. alla filer och kataloger

  2. noll eller fler underkataloger

Men det försvinner inte helt. **/ betyder att inga filer i katalogen på högsta nivå som ** gäller matchas.

Du behöver dir/*.ext dir/**/*.ext.

Kommentarer

  • Ja, det är precis min reserv, det ser bara inte söt ut. 😉

Svar

Detta fungerar som du förväntat dig i dessa versioner av Bash som levereras med de listade distributionerna :

  • 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

De versioner som anges ovan är faktiskt allt jag testat. Med andra ord hittade jag inte en version 4 av Bash där den inte fungerar. Alternativet globstar lades till i Bash 4.0 se FÖRÄNDRINGAR . I äldre versioner ska kommandot shopt -s globstar returnera ett fel.

Tester

1 . dir/**/*.ext matchar dir/file.ext:

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

2. **/*.ext matchar file.ext:

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

Förbereder miljön för att reproducera testerna ovan:

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

Kommentarer

  • detta är rätt svar. OP glömde att ställa in shopt -s globstar.

Svar

I ser ut för mig som om du har / har stängt av globstar. Det kan sättas på så här:

shopt -s globstar 

Det kommer inte bara att matcha noll underkataloger, utan det matchar inte två underkataloger heller:

$ 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 

Med globstar av, slutar ** bete sig precis som *, så dir/**/*.ext får samma resultat som dir/*/*.ext

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

vilket ibland lurar mig att tro att globstar är på

kolla din nuvarande globstar-inställning som detta:

shopt | grep globstar 

Kommentarer

  • Du kan kontrollera inställningen för skalalternativ direkt, som i shopt globstar.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *