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é?
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.
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>
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!
ls -la
s'il vous plaît?ls -lb
(ouls -lab
, si le nom commence par.
).dir1/foo
etdir2/foo
sur la machine X, puisscp
les avez modifiésdir42
sur 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?Réponses:
Peut-être qu'ils semblent seulement avoir le même nom.
Essayer:
Ils se ressemblent à peu près.
Un peu mieux. Le caractère espace est marqué comme
\
(bien que toutes lesls
implémentations ne le fassent pas).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:
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
Rend plus clair ce qui s'est passé.
Voir également cette autre réponse pour en savoir plus sur le sujet.
la source
LC_ALL=C sed -n 1
?sed
Lal
commande 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 GNUsed
, ce n'est pas nécessaire).LC_ALL=C ls -b
ls | LC_ALL=C sed -n l
c'était vraiment un gros gain de temps tout à l'heure, merci!