Ich habe diese Verzeichnisstruktur:

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

und mit dem globstar Option in Bash aktiviert, kann ich sagen:

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

Meine Frage ist: Warum ist dir/file.ext von dieser Liste ausgeschlossen?

Bash-Handbuch sagt dies über globstar:

Wenn festgelegt, stimmt das in einem Dateinamenerweiterungskontext verwendete Muster ** mit allen Dateien und null oder mehr Verzeichnissen und Unterverzeichnissen überein. Wenn dem Muster ein / folgt, stimmen nur Verzeichnisse und Unterverzeichnisse überein.

Null „in diesem Absatz lässt mich den Eindruck erwecken, dass dir/file.ext enthalten sein sollte; es sei denn, ich vermisse hoffentlich etwas.

Kommentare

  • Was ist dieses Zeichen? ɀ?
  • Welche Version von Bash, auf welcher Plattform? Ich kann ' dies nicht mit Bash 4.2.37 auf Debian Wheezy oder Bash 4.1.5 auf Debian Squeeze reproduzieren. @slm unicode ɀ oder Wikipedia
  • @Gilles Ist das eine Eingabeaufforderung?
  • slm, ja! ɀ ist nur ein Zeichen, das hier zur Unterscheidung von Eingabeaufforderungen verwendet wird. Einige Benutzer bevorzugen das Zeichen £ oder anstelle von $ :). Ursprünglich war ɀ ein ' z ' Zeichen, das für eine spezielle afrikanische Sprachnotation erstellt wurde: – )
  • " GNU-Bash, Version 3.2.53 (1) -freigabe (x86_64-apple-darwin13) " Im Lieferumfang von OS X 10.9 ist dieses Verhalten enthalten.

Antwort

Ich denke, das bezieht sich nur auf die Unterverzeichnisebene . ** ohne / stimmt mit

  1. allen Dateien und Verzeichnissen

  2. null oder mehr Unterverzeichnisse

Es verschwindet jedoch nicht vollständig. **/ bedeutet, dass keine Dateien im Verzeichnis der höchsten Ebene, für die ** gilt, übereinstimmen.

Sie benötigen dir/*.ext dir/**/*.ext.

Kommentare

  • Ja, das ist genau mein Fallback, es sieht einfach nicht hübsch aus. 😉

Antwort

Dies funktioniert wie erwartet in diesen Versionen von Bash, wie sie mit den aufgelisteten Distributionen geliefert werden :

  • 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

Tatsächlich sind die oben aufgeführten Versionen alles, was ich getestet habe. Mit anderen Worten, ich habe keine Version 4 von Bash gefunden, in der es nicht funktioniert. Die Option globstar wurde in Bash 4.0 hinzugefügt, siehe ÄNDERUNGEN . In älteren Versionen sollte der Befehl shopt -s globstar einen Fehler zurückgeben.

Tests

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

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

2. **/*.ext stimmt mit file.ext:

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

Vorbereiten der Umgebung zum Reproduzieren der obigen Tests:

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

Kommentare

  • Dies ist die richtige Antwort. Das OP hat vergessen, shopt -s globstar zu setzen.

Antwort

I. sieht für mich so aus, als hättest du Globstar ausgeschaltet. Es kann folgendermaßen aktiviert werden:

shopt -s globstar 

Es wird nicht nur nicht mit Null-Unterverzeichnissen übereinstimmen, sondern auch nicht mit zwei Unterverzeichnissen:

$ 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 

Wenn Globstar deaktiviert ist, verhält sich ** genauso wie *, sodass dir/**/*.ext das gleiche Ergebnis wie dir/*/*.ext

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

, was mich manchmal dazu bringt zu glauben, dass Globstar aktiviert ist

Überprüfen Sie Ihre aktuelle Globstar-Einstellung wie dies:

shopt | grep globstar 

Kommentare

  • Sie können eine Shell-Optionseinstellung direkt überprüfen, wie in shopt globstar.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.