Am această structură de director:

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

și, cu Opțiunea globstar activată în Bash, pot spune:

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

Întrebarea mea este: de ce este dir/file.ext exclus din această listă?

Manualul Bash spune acest lucru despre globstar:

Dacă este setat, modelul „**” utilizat într-un context de extindere a numelui de fișier va coincide cu toate fișierele și zero sau mai multe directoare și subdirectoare. Dacă modelul este urmat de un „/”, se potrivesc doar directoarele și subdirectoarele.

zero ”din acest paragraf lăsați-mă cu impresia că dir/file.ext ar fi trebuit să fie inclus; dacă nu cumva îmi lipsește ceva.

Comentarii

  • Ce este acest personaj? ɀ?
  • Ce versiune de bash, pe ce platformă? Nu pot ' să reproduc acest lucru cu bash 4.2.37 pe Debian wheezy sau bash 4.1.5 pe Debian squeeze. @slm unicode ɀ sau Wikipedia
  • @Gilles Este o solicitare?
  • slm, da! ɀ este doar un caracter folosit aici pentru a distinge promptul. Unii utilizatori preferă caracterul £ sau în loc de $ :). Inițial, ɀ a ' z ' caracter creat pentru o notație specială în limba africană: – )
  • " GNU bash, versiunea 3.2.53 (1) -release (x86_64-apple-darwin13) " livrat cu OS X 10.9 are acest comportament.

Răspuns

Cred că se referă doar la nivelul subdirectorului . ** fără / se potrivește

  1. toate fișierele și directoarele

  2. zero sau mai multe subdirectoare

Dar nu dispare complet. **/ înseamnă că niciun fișier din directorul de cel mai înalt nivel la care se aplică ** nu se potrivește.

Aveți nevoie de dir/*.ext dir/**/*.ext.

Comentarii

  • Da, exact asta este rezerva mea, pur și simplu nu arată frumos. 😉

Răspuns

Acest lucru funcționează așa cum vă așteptați în aceste versiuni de Bash, furnizate împreună cu distribuțiile listate :

  • 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 fapt, versiunile enumerate mai sus sunt tot ceea ce am testat. Cu alte cuvinte, nu am găsit o versiune 4 a lui Bash în care să nu funcționeze. Opțiunea globstar a fost adăugată în Bash 4.0 vezi CHANGES . În versiunile mai vechi, comanda shopt -s globstar ar trebui să returneze o eroare.

Teste

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

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

2. **/*.ext se potrivește cu file.ext:

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

Pregătirea mediului pentru reproducerea testelor de mai sus:

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

Comentarii

  • acesta este raspuns corect. PO a uitat să seteze shopt -s globstar.

Răspuns

I mi se pare că ai / ai oprit globstar. Poate fi activat astfel:

shopt -s globstar 

Nu numai că nu se va potrivi cu zero subdirectoare, dar nu va câștiga nici două subdirectoare:

$ 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 

Cu globstar dezactivat, ** ajunge să se comporte la fel ca *, deci dir/**/*.ext obține același rezultat ca și dir/*/*.ext

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

ceea ce mă păcălește uneori să cred că globstar este activ

verifică setarea curentă a globstar ca aceasta:

shopt | grep globstar 

Comentarii

  • Puteți verifica direct o opțiune shell, ca în shopt globstar.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *