Le système de fichiers macOS est insensible à la casse dans la plupart des répertoires par défaut. Dans un tel monde, qu'est-ce qui correspondrait à un joker?
Par exemple, si vous exécutez ce script
bash
#!/bin/bash
set -eu
#Caractères alphanumériques ASCII
touch foo.txt FOO.txt
ls *.txt && rm *.txt
#Caractères dits pleine largeur
touch zen.txt ZEN.txt
ls *.txt && rm *.txt
#Lettres grecques, lettres Kirill, chiffres romains
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
#Caractère fermé
touch ⓐ.txt # U+24D0
touch Ⓐ.txt # U+24B6
ls *.txt && rm *.txt
C'est le résultat
foo.txt
zen.txt
ωяⅶ.txt
nj.txt dz.txt
i.txt İ.txt ı.txt
ⓐ.txt
«FOO» et «foo» sont faciles. Puisqu'il n'est pas sensible à la casse, un seul peut survivre.
Comme vous pouvez le voir autour de zen
, ωяⅶ
et ⓐ
, les caractères en dehors de la plage ASCII 7 bits ont également des majuscules et des minuscules, et ils sont indiscernables.
«Dz» est un caractère de la catégorie «Lettre de la casse du titre» et n'est ni supérieur ni inférieur.
La minuscule correspondante est «dz» et la majuscule correspondante est «DZ».
Ce caractère est également insensible à la casse, donc même si vous écrivez touch dz.txt Dz.txt DZ.txt
, un seul peut survivre.
Le tableau ci-dessous montre les cas de «ı», «İ», «i», «I».
Langue | I Minuscule |
i Capitale |
---|---|---|
Anglais | i |
I |
la langue turque | ı |
İ |
Si vous touchez ı.txt
, İ.txt
, ʻi.txt, ʻI.txt
,
ʻI.txt,
İ.txt,
ı.txt` survivent.
En regardant unicode.org, «ı» minuscule sans points devient un «I» normal lorsqu'il est mis en majuscule. Néanmoins, sur APFS, «ı.txt» et «I.txt» sont considérés comme des noms différents.
J'ai essayé de voir ce qui se passe dans certains environnements.
Le résultat est dans l'environnement suivant:
C'est la même chose que POSIX glob et bash, donc cela semble être basique, mais c'est plutôt désagréable.
Fondamentalement,
Il est devenu. Il était assez surprenant que «Foo.txt» corresponde à 1 et «F * .txt» correspond à 0.
Autant que j'ai remarqué, j'ai le même avis que le système de fichiers où il n'y a pas de jokers.
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)
Le comportement de ruby est assez différent de POSIX glob.
Fondamentalement, cela semble cohérent avec le fonctionnement de "insensible à la casse".
Avec Foo.txt
, seulement foo.txt
correspond, et avec F * .txt
, foo.txt
et fred.txt
correspondent. Facile à comprendre.
Mais,
ruby
Dir.glob("dz-u*.txt") #=> []
Dir.glob("dz-uu.txt") #=> ["files/DZ-uu.txt"]
Il existe également un schéma selon lequel le nombre de correspondances diminue lorsqu'un caractère générique est inséré. punaise?
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)
Il y a une interface appelée PathMatcher
dans java.nio.file
, donc j'ai essayé de l'utiliser.
Ceci est également assez différent de POSIX glob.
Cela semble toujours être sensible à la casse.
Il se comporte différemment du nom de fichier dans le système de fichiers, mais est cohérent.
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)
Similaire au mouvement de ruby. Contrairement à ruby, «DZ * .txt» correspond correctement à «dz-ll.txt» (?). Cependant, au contraire, «DZ-uu.txt» ne peut pas être obtenu avec «dz-uu.txt».
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)
Étonnamment, le comportement est différent entre .NET Core et Mono. J'ai l'impression de perdre face au caractère «Dz», qui n'est ni supérieur ni inférieur.
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)
Il se comporte un peu comme POSIX glob, mais traite différemment les minuscules sans point i.
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 a le même avis que le système de fichiers sur la partie sans caractères génériques, mais il est difficile de comprendre qu'elle devienne sensible à la casse lorsque des caractères génériques sont inclus.
A le même avis que POSIX glob.
d'autre part
Semble traiter avec son propre algorithme et renvoie des résultats différents de POSIX glob. Cela a tendance à être dérangeant autour "d'un ensemble de deux lettres de l'alphabet qui ne peuvent être majuscules que pour la première lettre" et "un i inférieur avec des points supprimés".
Recommended Posts