Das macOS-Dateisystem unterscheidet in den meisten Verzeichnissen standardmäßig nicht zwischen Groß- und Kleinschreibung. Was würde in einer solchen Welt mit einer Wild Card übereinstimmen?
Zum Beispiel, wenn Sie dieses Skript ausführen
bash
#!/bin/bash
set -eu
#Alphanumerische ASCII-Zeichen
touch foo.txt FOO.txt
ls *.txt && rm *.txt
#Sogenannte Zeichen voller Breite
touch zen.txt ZEN.txt
ls *.txt && rm *.txt
#Griechische Buchstaben, Kirill-Buchstaben, römische Zahlen
touch ωяⅶ.txt ΩЯⅦ.txt
ls *.txt && rm *.txt
# DZ, NJ
touch dz.txt # U+01F3 Latin Small Letter DZ
touch Dz.txt # U+01F2 Latin Capital Letter D with Small Letter z
touch DZ.txt # U+01F1 Latin Capital Letter DZ
touch nj.txt # U+01CC Latin Small Letter NJ
touch Nj.txt # U+01CB Latin Capital Letter N with Small Letter J
touch NJ.txt # U+01CA Latin Capital Letter NJ
ls *.txt && rm *.txt
# i witout dot, etc.
touch ı.txt # U+0131 Small I without dot
touch İ.txt # U+0130 Capital I with dot
touch i.txt # U+0069 Small I
touch I.txt # U+0049 Capital I
ls *.txt && rm *.txt
#Beiliegender Charakter
touch ⓐ.txt # U+24D0
touch Ⓐ.txt # U+24B6
ls *.txt && rm *.txt
Das ist das Ergebnis
foo.txt
zen.txt
ωяⅶ.txt
nj.txt dz.txt
i.txt İ.txt ı.txt
ⓐ.txt
FOO
und foo
sind einfach. Da es nicht zwischen Groß- und Kleinschreibung unterscheidet, kann nur einer überleben.
Wie Sie um zen
, ωяⅶ
und ⓐ
sehen können, haben Zeichen außerhalb des 7-Bit-ASCII-Bereichs auch Groß- und Kleinbuchstaben und sind nicht zu unterscheiden.
Dz
ist ein Zeichen in der Kategorie" Groß- und Kleinschreibung "und weder oben noch unten.
Der entsprechende Kleinbuchstabe ist "dz" und der entsprechende Großbuchstabe ist "DZ".
Bei diesem Zeichen wird auch die Groß- und Kleinschreibung nicht berücksichtigt. Selbst wenn Sie "touch dz.txt Dz.txt DZ.txt" schreiben, kann nur einer überleben.
Die folgende Tabelle zeigt die Fälle von "ı", "İ", "i" und "I".
Sprache | I Kleinbuchstaben |
i Hauptstadt |
---|---|---|
Englisch | i |
I |
Türkisch | ı |
İ |
Wenn Sie ı.txt
, İ.txt
, i.txt
, I.txt
berühren,
i.txt
, İ.txt
, ı.txt
überleben.
Wenn Sie sich unicode.org ansehen, wird Kleinbuchstaben "ı" ohne Punkte normal "I", wenn sie groß geschrieben werden. In APFS werden "ı.txt" und "I.txt" jedoch als unterschiedliche Namen betrachtet.
Ich habe versucht zu sehen, was in einigen Umgebungen passiert.
Das Ergebnis ist in der folgenden Umgebung:
Es ist dasselbe wie POSIX glob und bash, daher scheint dies grundlegend zu sein, aber es ist ziemlich unangenehm.
Grundsätzlich,
Es ist geworden. Es war ziemlich überraschend, dass "Foo.txt" mit 1 und "F * .txt" mit 0 übereinstimmen würde.
Soweit ich bemerkt habe, bin ich der gleichen Meinung wie das Dateisystem, in dem es keine Platzhalter gibt.
F*/f*/Foo
wildcard | foo.txt | fred.txt |
---|---|---|
F*.txt | ❌ | ❌ |
f*.txt | ✅ | ✅ |
Foo.txt | ✅ | ❌ |
i / I / ı / İ
wildcard | i-lat-lo.txt | I-lat-up.txt | ı-tur-lo.txt | İ-tur-up.txt |
---|---|---|---|---|
i*.txt | ✅ | ❌ | ❌ | ❌ |
I*.txt | ❌ | ✅ | ❌ | ❌ |
ı*.txt | ❌ | ❌ | ✅ | ❌ |
İ*.txt | ❌ | ❌ | ❌ | ✅ |
İ-tur-lo.txt | ❌ | ❌ | ❌ | ❌ |
I-tur-lo.txt | ❌ | ❌ | ❌ | ❌ |
ı-lat-up.txt | ❌ | ❌ | ❌ | ❌ |
DZ / Dz / dz
wildcard | DZ-uu.txt | Dz-ul.txt | dz-ll.txt |
---|---|---|---|
DZ*.txt | ✅ | ❌ | ❌ |
Dz*.txt | ❌ | ✅ | ❌ |
dz*.txt | ❌ | ❌ | ✅ |
dz-uu.txt | ✅ | ❌ | ❌ |
dz-ul.txt | ❌ | ✅ | ❌ |
Dz-uu.txt | ✅ | ❌ | ❌ |
ruby(Dir.glob)
Das Verhalten von Ruby unterscheidet sich stark von POSIX glob.
Grundsätzlich scheint es im Einklang mit der Operation "Groß- und Kleinschreibung nicht berücksichtigen" zu stehen. Mit "Foo.txt" stimmen nur "foo.txt" überein, und mit "F * .txt" stimmen "foo.txt" und "fred.txt" überein. Einfach zu verstehen.
Aber,
ruby
Dir.glob("dz-u*.txt") #=> []
Dir.glob("dz-uu.txt") #=> ["files/DZ-uu.txt"]
Es gibt auch ein Muster, bei dem die Anzahl der Übereinstimmungen abnimmt, wenn ein Platzhalter eingefügt wird. Fehler?
F*/f*/Foo
wildcard | foo.txt | fred.txt |
---|---|---|
F*.txt | ✅ | ✅ |
f*.txt | ✅ | ✅ |
Foo.txt | ✅ | ❌ |
i / I / ı / İ
wildcard | i-lat-lo.txt | I-lat-up.txt | ı-tur-lo.txt | İ-tur-up.txt |
---|---|---|---|---|
i*.txt | ✅ | ✅ | ❌ | ❌ |
I*.txt | ✅ | ✅ | ❌ | ❌ |
ı*.txt | ❌ | ❌ | ✅ | ❌ |
İ*.txt | ❌ | ❌ | ❌ | ✅ |
İ-tur-lo.txt | ❌ | ❌ | ❌ | ❌ |
I-tur-lo.txt | ❌ | ❌ | ❌ | ❌ |
ı-lat-up.txt | ❌ | ❌ | ❌ | ❌ |
DZ / Dz / dz
wildcard | DZ-uu.txt | Dz-ul.txt | dz-ll.txt |
---|---|---|---|
DZ*.txt | ✅ | ❌ | ❌ |
Dz*.txt | ❌ | ✅ | ❌ |
dz*.txt | ❌ | ❌ | ✅ |
dz-uu.txt | ✅ | ❌ | ❌ |
dz-ul.txt | ❌ | ✅ | ❌ |
Dz-uu.txt | ✅ | ❌ | ❌ |
Java(PathMatcher)
Es gibt eine Schnittstelle namens "PathMatcher" in "java.nio.file", also habe ich versucht, sie zu verwenden. Dies unterscheidet sich auch erheblich von POSIX glob. Es scheint immer zwischen Groß- und Kleinschreibung zu unterscheiden. Es verhält sich anders als der Dateiname im Dateisystem, ist jedoch konsistent.
F*/f*/Foo
wildcard | foo.txt | fred.txt |
---|---|---|
F*.txt | ❌ | ❌ |
f*.txt | ✅ | ✅ |
Foo.txt | ❌ | ❌ |
i / I / ı / İ
wildcard | i-lat-lo.txt | I-lat-up.txt | ı-tur-lo.txt | İ-tur-up.txt |
---|---|---|---|---|
i*.txt | ✅ | ❌ | ❌ | ❌ |
I*.txt | ❌ | ✅ | ❌ | ❌ |
ı*.txt | ❌ | ❌ | ✅ | ❌ |
İ*.txt | ❌ | ❌ | ❌ | ✅ |
İ-tur-lo.txt | ❌ | ❌ | ❌ | ❌ |
I-tur-lo.txt | ❌ | ❌ | ❌ | ❌ |
ı-lat-up.txt | ❌ | ❌ | ❌ | ❌ |
DZ / Dz / dz
wildcard | DZ-uu.txt | Dz-ul.txt | dz-ll.txt |
---|---|---|---|
DZ*.txt | ✅ | ❌ | ❌ |
Dz*.txt | ❌ | ✅ | ❌ |
dz*.txt | ❌ | ❌ | ✅ |
dz-uu.txt | ❌ | ❌ | ❌ |
dz-ul.txt | ❌ | ❌ | ❌ |
Dz-uu.txt | ❌ | ❌ | ❌ |
C#(.NET Core / Directory.GetFiles)
Ähnlich wie bei Ruby.
Im Gegensatz zu Ruby stimmt DZ * .txt
richtig mit dz-ll.txt
überein (?).
Im Gegenteil, "DZ-uu.txt" kann nicht mit "dz-uu.txt" erhalten werden.
F*/f*/Foo
wildcard | foo.txt | fred.txt |
---|---|---|
F*.txt | ✅ | ✅ |
f*.txt | ✅ | ✅ |
Foo.txt | ✅ | ❌ |
i / I / ı / İ
wildcard | i-lat-lo.txt | I-lat-up.txt | ı-tur-lo.txt | İ-tur-up.txt |
---|---|---|---|---|
i*.txt | ✅ | ✅ | ❌ | ❌ |
I*.txt | ✅ | ✅ | ❌ | ❌ |
ı*.txt | ❌ | ❌ | ✅ | ❌ |
İ*.txt | ❌ | ❌ | ❌ | ✅ |
İ-tur-lo.txt | ❌ | ❌ | ❌ | ❌ |
I-tur-lo.txt | ❌ | ❌ | ❌ | ❌ |
ı-lat-up.txt | ❌ | ❌ | ❌ | ❌ |
DZ / Dz / dz
wildcard | DZ-uu.txt | Dz-ul.txt | dz-ll.txt |
---|---|---|---|
DZ*.txt | ✅ | ✅ | ✅ |
Dz*.txt | ✅ | ✅ | ✅ |
dz*.txt | ✅ | ✅ | ✅ |
dz-uu.txt | ❌ | ❌ | ❌ |
dz-ul.txt | ❌ | ❌ | ❌ |
Dz-uu.txt | ❌ | ❌ | ❌ |
C#(Mono / Directory.GetFiles)
Überraschenderweise unterscheidet sich das Verhalten zwischen .NET Core und Mono. Ich habe das Gefühl, ich verliere gegen den Charakter "Dz", der weder oben noch unten ist.
F*/f*/Foo
wildcard | foo.txt | fred.txt |
---|---|---|
F*.txt | ✅ | ✅ |
f*.txt | ✅ | ✅ |
Foo.txt | ✅ | ❌ |
i / I / ı / İ
wildcard | i-lat-lo.txt | I-lat-up.txt | ı-tur-lo.txt | İ-tur-up.txt |
---|---|---|---|---|
i*.txt | ✅ | ✅ | ❌ | ❌ |
I*.txt | ✅ | ✅ | ❌ | ❌ |
ı*.txt | ❌ | ❌ | ✅ | ❌ |
İ*.txt | ❌ | ❌ | ❌ | ✅ |
İ-tur-lo.txt | ❌ | ❌ | ❌ | ❌ |
I-tur-lo.txt | ❌ | ❌ | ❌ | ❌ |
ı-lat-up.txt | ❌ | ❌ | ❌ | ❌ |
DZ / Dz / dz
wildcard | DZ-uu.txt | Dz-ul.txt | dz-ll.txt |
---|---|---|---|
DZ*.txt | ✅ | ❌ | ✅ |
Dz*.txt | ❌ | ✅ | ❌ |
dz*.txt | ✅ | ❌ | ✅ |
dz-uu.txt | ✅ | ❌ | ❌ |
dz-ul.txt | ❌ | ❌ | ❌ |
Dz-uu.txt | ❌ | ❌ | ❌ |
Perl(glob)
Es verhält sich ähnlich wie POSIX glob, behandelt aber den punktlosen Kleinbuchstaben i anders.
F*/f*/Foo
wildcard | foo.txt | fred.txt |
---|---|---|
F*.txt | ❌ | ❌ |
f*.txt | ✅ | ✅ |
Foo.txt | ✅ | ❌ |
i / I / ı / İ
wildcard | i-lat-lo.txt | I-lat-up.txt | ı-tur-lo.txt | İ-tur-up.txt |
---|---|---|---|---|
i*.txt | ✅ | ❌ | ❌ | ❌ |
I*.txt | ❌ | ✅ | ❌ | ❌ |
ı*.txt | ❌ | ❌ | ✅ | ❌ |
İ*.txt | ❌ | ❌ | ❌ | ✅ |
İ-tur-lo.txt | ❌ | ❌ | ❌ | ❌ |
I-tur-lo.txt | ❌ | ❌ | ✅ | ❌ |
ı-lat-up.txt | ❌ | ✅ | ❌ | ❌ |
DZ / Dz / dz
wildcard | DZ-uu.txt | Dz-ul.txt | dz-ll.txt |
---|---|---|---|
DZ*.txt | ✅ | ❌ | ❌ |
Dz*.txt | ❌ | ✅ | ❌ |
dz*.txt | ❌ | ❌ | ✅ |
dz-uu.txt | ✅ | ❌ | ❌ |
dz-ul.txt | ❌ | ✅ | ❌ |
Dz-uu.txt | ✅ | ❌ | ❌ |
POSIX glob hat die gleiche Meinung wie das Dateisystem bezüglich des Teils ohne Platzhalter, aber es ist schwer zu verstehen, dass die Groß- und Kleinschreibung beachtet wird, wenn Platzhalter enthalten sind.
Hat die gleiche Meinung wie POSIX glob.
auf der anderen Seite
Scheint mit einem eigenen Algorithmus zu verarbeiten und liefert andere Ergebnisse als POSIX glob. Es neigt dazu, um "einen Satz von zwei Buchstaben des Alphabets, der nur für den ersten Buchstaben großgeschrieben werden kann" und "ein unteres i mit entfernten Punkten" zu stören.
Recommended Posts