[GO] Die unglückliche Welt der Wildcards ohne Berücksichtigung der Groß- und Kleinschreibung (macOS)

Über diesen Artikel

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?

Ohne Berücksichtigung der Groß- und Kleinschreibung

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 IKleinbuchstaben iHauptstadt
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.

Korrespondenz in verschiedenen Umgebungen

Ich habe versucht zu sehen, was in einigen Umgebungen passiert.

Shell-Skript (Bash) usw.

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

Zusammenfassung

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

Die unglückliche Welt der Wildcards ohne Berücksichtigung der Groß- und Kleinschreibung (macOS)
Die Welt der Bücher der Steuerungstechnik
Die Geschichte, Sourcetrail × macOS × VS Code auszuprobieren
Studie vom Anfang von Python Hour1: Hallo Welt
Der Beginn von cif2cell
Die Bedeutung des Selbst
der Zen von Python
Die Geschichte von sys.path.append ()
Rache der Typen: Rache der Typen
Ich möchte die Legende der IT-Technologiewelt kennenlernen