Bagaimana dua file di salah satu folder saya memiliki nama yang sama?

12

Saya mengunduh dua file, keduanya disimpan ke nama file yang sama dan kemudian saya transfer dengan scp ke komputer lain.

Mengapa mereka tidak menjadi satu ketika yang kedua diselamatkan?

sesuatu Sesuatu
sumber
2
Bisakah Anda menunjukkan hasil ls -latolong?
ryekayo
2
Lebih baik lagi, ls -lb(atau ls -lab, jika namanya dimulai dengan .).
G-Man Mengatakan 'Reinstate Monica'
1
Juga, apa, tepatnya, yang terjadi? Anda mengunduh dir1/foodan dir2/foomenggunakan mesin X, lalu scpmengeditnya dir42di mesin Y, dan mereka keluar sebagai file terpisah dengan nama yang sama? Atau Anda mengunduh dua file dengan nama yang sama ke direktori yang sama (pada mesin X), dan mereka keluar sebagai file terpisah dengan nama yang sama?
G-Man Mengatakan 'Reinstate Monica'

Jawaban:

39

Mungkin mereka hanya terlihat memiliki nama yang sama.

Mencoba:

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

Mereka terlihat hampir sama.

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

Sedikit lebih baik. Karakter spasi ditandai sebagai \ (walaupun tidak semua lsimplementasi melakukan itu).

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

Sekarang kita berbicara (semua karakter non-ASCII diberikan sebagai nilai oktal dari konstituen byte mereka)

Anda juga dapat melakukannya, dan itu berfungsi untuk masukan apa pun:

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

Di sini, ujung garis ditandai dengan $yang membuatnya lebih mudah untuk menemukan ruang trailing. Namun, itu tidak akan membantu menemukan file yang dipanggilSté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>

Buat lebih jelas apa yang terjadi.

Lihat juga jawaban lain ini untuk lebih lanjut tentang masalah ini.

Stéphane Chazelas
sumber
1
Jika Anda tidak keberatan saya bertanya kepada Stephane, apa yang dilakukan perintah pipa LC_ALL=C sed -n 1?
ryekayo
3
sed's lperintah menampilkan input dalam bentuk visual ambigu. Dengan LC_ALL = C, kami memastikan hanya menggunakan karakter ASCII untuk itu (meskipun setidaknya dengan GNU sed, itu tidak perlu).
Stéphane Chazelas
2
@ StéphaneChazelas Anda juga dapat menggunakan:LC_ALL=C ls -b
vinc17
@ vinc17, poin bagus, itu juga lebih baik daripada sed to spot file dengan karakter baris baru, tetapi tidak selalu menemukan spasi tambahan. Saya telah menambahkannya ke jawabannya.
Stéphane Chazelas
Sial, TIL bahwa Anda dapat memiliki spasi di akhir nama file dan sepertinya ada dua nama file yang identik di sistem file.! Jawaban yang bagus, ls | LC_ALL=C sed -n lbenar-benar menghemat waktu sekarang, terima kasih!
Elijah Lynn