Comment deux fichiers dans un de mes dossiers peuvent-ils avoir le même nom?

12

J'ai téléchargé deux fichiers, ils ont tous deux été enregistrés sous le même nom de fichier, puis je les ai transférés avec scp vers un autre ordinateur.

Pourquoi ne sont-ils pas devenus un lorsque le second a été sauvé?

quelque chose quelque chose
la source
2
Pouvez-vous montrer les résultats de ls -las'il vous plaît?
ryekayo
2
Mieux encore ls -lb(ou ls -lab, si le nom commence par .).
G-Man dit `` Réintègre Monica ''
1
Et que s'est-il passé exactement? Vous les avez téléchargés dir1/fooet dir2/foosur la machine X, puis scples avez modifiés dir42sur la machine Y, et ils sont sortis sous forme de fichiers séparés portant le même nom? Ou vous avez téléchargé deux fichiers portant le même nom dans le même répertoire (sur la machine X), et ils sont sortis sous forme de fichiers distincts portant le même nom?
G-Man dit `` Réintègre Monica ''

Réponses:

39

Peut-être qu'ils semblent seulement avoir le même nom.

Essayer:

$ touch Stéphane Stéphane Stéphane\  St​éphane
$ ls -1
Stéphane
Stéphane
St​éphane
Stéphane 

Ils se ressemblent à peu près.

$ ls -1b
Stéphane
Stéphane
St​éphane
Stéphane\ 

Un peu mieux. Le caractère espace est marqué comme \ (bien que toutes les lsimplémentations ne le fassent pas).

$ LC_ALL=C ls -1b
Ste\314\201phane
St\303\251phane
St\303\251phane\ 
St\342\200\213\303\251phane

Maintenant, nous parlons (tous les caractères non ASCII sont rendus comme la valeur octale de leurs constituants d'octets)

Vous pouvez également le faire, et cela fonctionne pour n'importe quelle entrée:

$ ls | LC_ALL=C sed -n l
Ste\314\201phane$
St\303\251phane$
St\342\200\213\303\251phane$
St\303\251phane $

Ici, la fin des lignes est marquée avec $ce qui facilite la détection de l'espace de fin. Cependant, cela n'aidera pas à repérer un fichier appeléStéphane<newline>Stéphane

$ ls | perl -Mopen=locale -MUnicode::UCD=charinfo -lpe '
       s/[^\41-\177]/"<".charinfo(ord$&)->{name}.">"/ge'
Ste<COMBINING ACUTE ACCENT>phane
St<LATIN SMALL LETTER E WITH ACUTE>phane
St<ZERO WIDTH SPACE><LATIN SMALL LETTER E WITH ACUTE>phane
St<LATIN SMALL LETTER E WITH ACUTE>phane<SPACE>

Rend plus clair ce qui s'est passé.

Voir également cette autre réponse pour en savoir plus sur le sujet.

Stéphane Chazelas
la source
1
Si cela ne vous dérange pas que je demande à Stéphane, que fait la commande canalisée LC_ALL=C sed -n 1?
ryekayo
3
sedLa lcommande affiche l'entrée sous une forme visuellement non ambiguë. Avec LC_ALL = C, nous nous assurons qu'il n'utilise que des caractères ASCII pour cela (bien qu'au moins avec GNU sed, ce n'est pas nécessaire).
Stéphane Chazelas
2
@ StéphaneChazelas Vous pouvez également utiliser:LC_ALL=C ls -b
vinc17
@ vinc17, bon point, c'est aussi mieux que sed pour repérer les fichiers avec des caractères de nouvelle ligne, mais pas toujours pour repérer l'espace de fin. Je l'ai ajouté à la réponse.
Stéphane Chazelas
Merde, TIL que vous pouvez avoir des espaces à la fin d'un nom de fichier et il semble qu'il y ait deux fichiers de noms identiques sur le système de fichiers.! Excellente réponse, ls | LC_ALL=C sed -n lc'était vraiment un gros gain de temps tout à l'heure, merci!
Elijah Lynn