Como dois arquivos em uma das minhas pastas têm o mesmo nome?


12

Baixei dois arquivos, ambos foram salvos no mesmo nome de arquivo e depois os transferi com o scp para outro computador.

Por que eles não se tornaram um quando o segundo foi salvo?


2
Você pode mostrar os resultados de ls -lapor favor?
precisa saber é o seguinte

2
Melhor ainda, ls -lb(ou ls -lab, se o nome começar com .).
G-Man diz 'Restabelecer Monica

1
Além disso, o que exatamente aconteceu? Você fez o download dir1/fooe dir2/foona máquina X, em seguida scp, colocou-as dir42na máquina Y e elas apareceram como arquivos separados com o mesmo nome? Ou você baixou dois arquivos com o mesmo nome no mesmo diretório (na máquina X) e eles saíram como arquivos separados com o mesmo nome?
G-Man diz 'Reinstate Monica'

Respostas:


39

Talvez eles apenas pareçam ter o mesmo nome.

Experimentar:

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

Eles parecem praticamente o mesmo.

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

Um pouco melhor. O caractere de espaço é sinalizado como \ (embora nem todas as lsimplementações façam isso).

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

Agora estamos falando (todos os caracteres não ASCII são renderizados como o valor octal de seus constituintes de bytes)

Você também pode fazer, e isso funciona para qualquer entrada:

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

Aqui, o final das linhas é marcado com o $que facilita a localização do espaço à direita. No entanto, isso não ajudará a localizar um arquivo chamadoSté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>

Torna mais claro o que aconteceu.

Veja também esta outra resposta para mais informações sobre o assunto.


1
Se você não se importa que eu pergunte a Stephane, o que o comando canalizado LC_ALL=C sed -n 1faz?
precisa saber é o seguinte

3
sedO lcomando de exibe a entrada de forma visualmente inequívoca. Com LC_ALL = C, garantimos que ele use apenas caracteres ASCII para isso (embora pelo menos no GNU sed, não seja necessário).
Stéphane Chazelas

2
@ StéphaneChazelas Você também pode usar:LC_ALL=C ls -b
vinc17

@ vinc17, bom ponto, também é melhor do que sed para localizar arquivos com caracteres de nova linha, mas nem sempre para localizar espaço à direita. Eu adicionei à resposta.
Stéphane Chazelas

Porra, até que você possa ter espaços no final de um nome de arquivo e parece que existem dois arquivos de nomes idênticos no sistema de arquivos.! Ótima resposta, ls | LC_ALL=C sed -n lrealmente economizou muito tempo agora, obrigado!
Elijah Lynn
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.