bash globstar eşleştirme


18

Bu dizin yapısı var:

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

ve globstarBash'te seçenek etkinleştirildiğinde şunu söyleyebilirim:

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

Sorum şu: neden dir/file.extbu listenin dışında bırakılıyor?

Bash manual şunları söylüyor globstar:

Ayarlanırsa, dosya adı genişletme bağlamında kullanılan '**' deseni tüm dosyalarla ve sıfır veya daha fazla dizin ve alt dizinle eşleşir. Deseni bir '/' izliyorsa, yalnızca dizinler ve alt dizinler eşleşir.

Bu paragraftaki “ sıfır ”, dir/file.extdahil edilmesi gereken bir izlenim bırakmamı sağlar ; umarım bir şeyleri kaçırmazsam.


2
Bu karakter nedir? ɀ?
slm

2
Hangi platformda hangi bash sürümü? Bu Debian wheezy bash 4.2.37 veya Debian sıkma bash 4.1.5 ile çoğaltamam. @slm unicode ɀveya Wikipedia
Gilles 'SO- kötü olmayı bırak'

1
@Gilles Bu bir istem mi?
slm

5
slm, Evet! ɀburada istemi ayırt etmek için kullanılan bir karakter. Bazı kullanıcılar karakteri tercih eder £veya :) yerine $. Başlangıçta, ɀözel bir Afrika dili gösterimi için bir 'z' karakteri yaratıldı :-)
Slyx

1
OS X 10.9 ile birlikte gönderilen "GNU bash, sürüm 3.2.53 (1) -release (x86_64-apple-darwin13)" bu davranışa sahiptir.
natevw

Yanıtlar:


8

Sanırım bu sadece alt dizin seviyesine işaret ediyor. maçlar **olmadan/

  1. tüm dosyalar ve dizinler

  2. sıfır veya daha fazla alt dizin

Ancak tamamen ortadan kalkmaz. **/, **geçerli olan en üst düzey dizindeki hiçbir dosyanın eşleşmediği anlamına gelir .

Gerek dir/*.ext dir/**/*.ext.


Evet, tam olarak benim yedekim, güzel görünmüyor. ;-)
Vlad GURDIGA

10

Bu, listelenen dağıtımlarla birlikte sunulan Bash'in bu sürümlerinde beklediğiniz gibi çalışır:

  • 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

Aslında yukarıda listelenen sürümler test ettiğim tek şey. Başka bir deyişle, Bash'in çalışmadığı bir sürüm 4'ü bulamadım. Seçenek globstarBash 4.0'da eklendi, bkz. DEĞİŞİKLİKLER . Eski sürümlerde komut shopt -s globstarbir hata döndürmelidir.

Testler

1. dir/**/*.ext maçlar dir/file.ext:

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

2. **/*.ext eşleşme file.ext:

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

Yukarıdaki testleri çoğaltmak için ortamın hazırlanması :

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

2
Bu doğru cevap. OP kurmayı unuttu shopt -s globstar.
CS Pei

5

Bana globtarý kapattýđýn gibi yaptým. Bu şekilde açılabilir:

shopt -s globstar

Sadece sıfır alt dizinle eşleşmez, aynı zamanda iki alt dizinle de eşleşmez:

$ 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

Globstar kapalıyken, ** tıpkı * gibi davranır, bu yüzden dir/**/*.extaynı sonucu alırdir/*/*.ext

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

ki bazen beni globstar'ın

mevcut globstar ayarınızı şu şekilde kontrol edin:

shopt | grep globstar

1
Bir kabuk seçenek ayarını olduğu gibi doğrudan kontrol edebilirsiniz shopt globstar.
Benjamin W.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.