14

I downloaded two files, they were both saved to the same filename and then I transferred them with scp to another computer.

Why didn't they become one when the second was saved?

1 Answers1

41

Maybe they only look like they have the same name.

Try:

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

They look pretty much the same.

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

Slightly better. The space character is flagged as \ (though not all ls implementations do that).

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

Now we're talking (all non-ASCII characters are rendered as the octal value of their byte constituents)

You could also do, and that works for any input:

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

Here, the end of lines is marked with $ which makes it easier to spot the trailing space. However, that won't help spotting a file called 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>

Makes it clearer what happened.

See also this other answer for more on the subject.

  • 1
    If you don't mind me asking Stephane, what does the piped command LC_ALL=C sed -n 1 do? – ryekayo Aug 15 '14 at 21:59
  • 3
    sed's l command displays the input in visually unambiguous form. With LC_ALL=C, we make sure it uses only ASCII characters for that (though at least with GNU sed, it is not necessary). – Stéphane Chazelas Aug 15 '14 at 22:07
  • 2
    @StéphaneChazelas You can also use: LC_ALL=C ls -b – vinc17 Aug 16 '14 at 00:11
  • @vinc17, good point, that's also better than sed to spot files with newline characters, but not always to spot trailing space. I've added it to the answer. – Stéphane Chazelas Aug 16 '14 at 07:11
  • Damn, TIL that you can have spaces at the end of a file name and it looks like there are two identically names files on the filesystem.! Great answer, ls | LC_ALL=C sed -n l really was a big time saver just now, thanks! – Elijah Lynn Mar 16 '20 at 01:06
  • The command ls | LC_ALL=C sed -n l helps me find out that my other filename has a space behind! – Ting Yi Shih May 24 '20 at 14:38