staging.inyokaproject.org

Globbing im aktuellen Verzeichnis und einem Unterverzeichnis

Status: Gelöst | Ubuntu-Version: Xubuntu 24.04 (Noble Numbat)
Antworten |

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Ich versuche Dateien mit einer bestimmten Erweiterung im aktuellen Verzeichnis (".") und in einem Unterverzeichnis per Globbing zu erfassen, aber irgendetwas muss ich übersehen, denn es funktioniert nicht:

Versuchsaufbau:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ mkdir d e
$ touch a.{txt,foo} d/b.{txt,bar}
$ find
.
./d
./d/b.txt
./d/b.bar
./e
./a.txt
./a.foo

Ich hatte erwartet, dass das funktioniert:

1
2
$ echo @(.|d)/*.@(txt|foo)
d/b.txt

Erwartet wäre zusätzlich die Ausgabe "./b.txt". So geht es:

1
2
$ echo {.,d}/*.@(txt|foo)
./a.foo ./a.txt d/b.txt

Aber dieser Ansatz hat den Nachteil, das das Muster ohne "nullglob" stehen bleibt, falls kein Dateiname erfasst wird:

1
2
$ echo {.,d}/*.@(bar|abc)
./*.@(bar|abc) d/b.bar

Aber warum funktioniert der andere Ansatz nicht? shopt -s extglob ist da und der Absatz "Pattern Matching" der Manpage von bash erwähnt eine spezielle Behandlung von ".", aber das Verhalten ändert sich nicht, egal, ob "dotglob" eingeschaltet ist oder nicht, obwohl mit "dotglob" eingeschaltet Dateinamen mit führendem Punkt erfasst werden müssten. Hat jemand eine Erklärung?

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9837

rklm schrieb:

[…] Ich hatte erwartet, dass das funktioniert:

1
2
$ echo @(.|d)/*.@(txt|foo)
d/b.txt

Erwartet wäre zusätzlich die Ausgabe "./b.txt".

Dazu müsste die Datei ./b.txt existieren. Nach Deinem Versuchsaufbau gibt es sie aber nicht.

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1303

Dazu müsste die Datei ./b.txt existieren.

Ich denke es ist ./a.txt gemeint

Ich habe mal mit "globskipdots" gespielt.

$ shopt globskipdots
globskipdots   	on
$ echo @(.|d)/*.@(txt|foo)
d/b.txt
$ shopt -u globskipdots
$ echo @(.|d)/*.@(txt|foo)
./a.foo ./a.txt d/b.txt
$ 

Eventuell hilft das bei der Überlegung weiter.

rklm Team-Icon

Projektleitung
(Themenstarter)

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

shiro schrieb:

Dazu müsste die Datei ./b.txt existieren.

Ich denke es ist ./a.txt gemeint

Korrekt. Sorry für die Verwirrung.

Ich habe mal mit "globskipdots" gespielt.

Das erklärt es. Ich hätte nur die Doku gründlicher lesen müssen. Danke!

Antworten |