Wie können zwei Dateien in einem meiner Ordner denselben Namen haben?

11

Ich habe zwei Dateien heruntergeladen, beide wurden unter demselben Dateinamen gespeichert und dann mit scp auf einen anderen Computer übertragen.

Warum wurden sie nicht eins, als das zweite gerettet wurde?

etwas etwas
quelle
2
Können Sie ls -labitte die Ergebnisse von zeigen ?
Ryekayo
2
Besser noch ls -lb(oder ls -labwenn der Name mit beginnt .).
G-Man sagt "Reinstate Monica"
1
Und was genau ist passiert? Sie heruntergeladen dir1/foound dir2/fooauf Maschine X, dann scp‚ed sich dir42auf Maschine Y, und sie kamen als separate Dateien mit dem gleichen Namen aus? Oder Sie haben zwei Dateien mit demselben Namen in dasselbe Verzeichnis (auf Computer X) heruntergeladen und sie wurden als separate Dateien mit demselben Namen ausgegeben?
G-Man sagt "Reinstate Monica"

Antworten:

38

Vielleicht sehen sie nur so aus, als hätten sie den gleichen Namen.

Versuchen:

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

Sie sehen ziemlich gleich aus.

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

Etwas besser. Das Leerzeichen wird als gekennzeichnet \ (obwohl dies nicht bei allen lsImplementierungen der Fall ist).

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

Jetzt sprechen wir (alle Nicht-ASCII-Zeichen werden als Oktalwert ihrer Bytebestandteile gerendert).

Sie können dies auch tun, und das funktioniert für jede Eingabe:

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

Hier ist das Zeilenende markiert, mit $dem der nachfolgende Raum leichter erkannt werden kann. Dies hilft jedoch nicht, eine aufgerufene Datei zu erkennenSté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>

Macht es klarer, was passiert ist.

Siehe auch diese andere Antwort für weitere Informationen zu diesem Thema.

Stéphane Chazelas
quelle
1
Wenn es Ihnen nichts ausmacht, wenn ich Stephane frage, was macht der Piped-Befehl LC_ALL=C sed -n 1?
Ryekayo
3
sedDer lBefehl '' zeigt die Eingabe in visuell eindeutiger Form an. Mit LC_ALL = C stellen wir sicher, dass dafür nur ASCII-Zeichen verwendet werden (obwohl dies zumindest bei GNU sednicht erforderlich ist).
Stéphane Chazelas
2
@ StéphaneChazelas Sie können auch verwenden:LC_ALL=C ls -b
vinc17
@ vinc17, guter Punkt, das ist auch besser als sed, um Dateien mit Zeilenumbrüchen zu erkennen, aber nicht immer, um nachgestellten Leerzeichen zu erkennen. Ich habe es der Antwort hinzugefügt.
Stéphane Chazelas