find e rsync ambos engasgam com arquivos com nomes estranhos

7

Este não é um problema importante para mim, mas eu achei que o rsync e o find foram bastante robustos, então fiquei surpreso quando o rsync engasgou com um arquivo, e depois o encontrou também. ls -l mostra que o arquivo tem 6093 bytes (e é o único arquivo nesse diretório que faz isso, então eu fiz isso depois do cd para esse diretório):

# find . -size 6093c
./????????????????????????:??????????????????????????????????????????
find: './364350:370255450_554300314404_224464_474': No such file or directory

Alguma ideia do que isso significa? Estranhamente,

# find . -size 6093c | xargs less

funciona bem. Veja o que eu vejo:

# ls -lat | fgrep "6093 "
ls: cannot access ''$'364350'':'$'370255450''_'$'554300314404''_'$'224464''_'$'474': No such file or directory
-rw-rw-r--. 1 nobody nobody   6093 Oct 23  2013 หมวà¸à¸«à¸¡à¸¹à¹:à¹à¸à¸¡à¹à¸à¸§à¹à¸­à¹à¸¡à¸£à¸´à¸à¸²

Só fica um pouco melhor se eu canalizar os resultados para menos:

# ls -lat | fgrep "6093 " | less

ls: cannot access ''$'364350'':'$'370255450''_'$'554300314404''_'$'224464''_'$'474': No such file or directory
-rw-rw-r--. 1 nobody nobody   6093 Oct 23  2013 <E0><B8><AB><E0><B8><A1><E0><B8><A7><E0><B8><94><E0><B8><AB><E0><B8><A1><E0><B8><B9><E0><B9><88>:<E0><B9><80>
<E0><B8><81><E0><B8><A1><E0><B9><82><E0><B8><8A><E0><B8><A7><E0><B9><8C><E0><B8><AD><E0><B9><80><E0><B8><A1><E0><B8><A3><E0><B8><B4><E0><B8><81><E0><B8><B2>

O mesmo diretório tem um arquivo que nem eu consigo manipular, mas posso listá-lo já que ele aparece como a entrada mais antiga:

# ls -lat | tail -1 | less
ls: cannot access ''$'364350'':'$'370255450''_'$'554300314404''_'$'224464''_'$'474': No such file or directory
-?????????? ? ?      ?           ?            ? <EB><B6><84><EB><A5><98>:<EB>
<AF><B8><EA><B5><AD><EC><9D><98>_<ED><85><94><EB><A0><88><EB><B9><84><EC><A0>
<84>_<EA><B2><8C><EC><9E><84>_<EC><87><BC>

Não é super importante, mas uma espécie de curiosidade.

EDIT: uma vez que esta questão parece ter atraído muita atenção rapidamente, fiz uma pequena "pesquisa" (que pode ou não ser totalmente precisa). Eu não consegui replicar o problema, mas:

  • Em ou próximo a 23 de outubro de 2013, visitei a página wikidata.org nos programas American Game. Naquela época, era assim: link

  • Em seguida, segui um ou mais links de idiomas estrangeiros.

  • Nos links externos que usei, usei o link ! para baixar todos os links.

  • Fazer isso produz muitos nomes de arquivos com caracteres especiais, e tenho quase certeza de que é assim que consegui esses dois arquivos estranhos.

  • No entanto, fazendo isso hoje, ainda recebo nomes de arquivos com caracteres especiais, mas não exatamente os que estão abaixo.

por barrycarter 18.11.2016 / 19:55

1 resposta

1

O arquivo com nomes estranhos pode ser um arenque vermelho. Suas ferramentas estão realizando vários truques para fazer você pensar que algo está quebrado.

O nome do arquivo está em UTF-8, então você deve export LANG=en_US.UTF-8 permitir que seus comandos usem o nome do arquivo sem atrito. Execute o comando locale sem argumentos para verificar as variáveis de ambiente atuais.

Ou, se você insistir em usar a localidade "C", use ls -b para ter ls seqüências de escape de impressão em vez de pontos de interrogação. Então você pode usar $'364\…' como um argumento no bash.

O comando find se recusa covardemente a escrever caracteres não-textuais em um tty. Em outras palavras, find e find | cat se comportam de maneira diferente, com o último escrevendo os nomes sem aspas, é por isso que find | xargs está de fato funcionando. Uma maneira mais robusta de escrever isso é find -print0 | xargs -0 para evitar que possíveis caracteres de espaço em branco sejam interpretados por xargs.

Isso não explica o "Nenhum arquivo ou diretório" - por todos os meios, seu sistema de arquivos pode conter um erro - mas deve permitir que você declare sua intenção na linha de comando com mais precisão.

No começo, não achei relevante, mas tenho o hábito de prefixar nomes de arquivos estranhos com ./ para impedir que comandos os interpretem. A barra lateral mostrava uma pergunta relacionada "rsync: dois-pontos em nomes de arquivos" , o que pode seja a causa raiz do seu erro de rsync.

    
por 29.11.2016 / 19:40