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?

Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
somethingSomething
  • 5,721
  • 18
  • 58
  • 98

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.

Stéphane Chazelas
  • 522,931
  • 91
  • 1,010
  • 1,501
  • 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