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
Răspuns
Cred că se referă doar la nivelul subdirectorului . **
fără /
se potrivește
-
toate fișierele și directoarele
-
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
.
ɀ
?unicode ɀ
sau Wikipediaɀ
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ă: – )