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
-
allen Dateien und Verzeichnissen
li überein >
-
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
.