Renomear arquivo com nome estranho na montagem do Samba

10

Quero renomear o arquivo com nome estranho para algo razoável, mas não consigo: /

$ mv *_000c.jpg 000c.jpg
mv: cannot move '?j?Z?R?C1_000c.jpg' to '000c.jpg': No such file or directory

Eu tentei usar o número do inode, como foi recomendado em alguns lugares da internet:

$ ls -il *000c.jpg
ls: '?j?Z?R?C1_000c.jpg': No such file or directory
213915 -rw-r--r-- 1 wolf wolf 794655 Jul 21  2012 '?j?Z?R?C1_000c.jpg'
$ find . -inum 213915 -print0 | xargs -0 -I '{}' mv '{}' 000c.jpg
mv: cannot move './?j?Z?R?C1_000c.jpg' to '000c.jpg': No such file or directory

O que devo fazer?

Lobo cinza
fonte
1
Qual é a saída de um simples lsnesse diretório? O arquivo é mostrado como um arquivo regular? Estou pedindo para ter certeza de que No such file or directoryhá um erro oculto e não indicativo de um sistema de arquivos danificado.
terdon
1
Gostaria de saber se o sistema de arquivos precisa ser executado fsck? Eu posso estar corrompido. Como o arquivo adquiriu esse nome?
Kusalananda
1
@Mioriin Os pontos de interrogação no nome do arquivo são (ou podem ser) espaços reservados para caracteres que não podem ser exibidos. (uma razão para não analisar a saída de ls)
Kusalananda
1
Isso pode ser um problema de fonte do terminal. Está mostrando ?letras que não podem ser exibidas. Tente mudar para uma fonte totalmente unicode.
Mio Rin
5
@Mioriin Se o nome do arquivo pode ou não ser exibido, é um arenque vermelho neste caso, eu acho. O estranho é que o shell é capaz de expandir, *_000c.jpgmas que mvnão pode processar o arquivo. Isso é, IMHO, indicativo de um sistema de arquivos corrompido. ... ou possivelmente de um sistema de arquivos montado em um compartilhamento de rede que desapareceu (com as entradas de diretório ainda em cache), ou algo assim.
Kusalananda

Respostas:

16

Resumo dos comentários relevantes:

Os sistemas de arquivos Unix permitem qualquer caractere em um nome de arquivo além de \0(nul) e /(barra). O fato de lsmostrar pontos de interrogação é apenas porque ele não pode exibir alguns dos caracteres do nome do arquivo no código do idioma atual (que é um dos motivos pelos quais você deve evitar analisar a saída dels ).

No entanto, com um compartilhamento Samba, você aparentemente possui requisitos mais rígidos em nomes de arquivos do que em um sistema de arquivos Unix padrão.

Como o arquivo tinha um nome "ilegal" no seu compartilhamento intermediário do Samba, o arquivo estava inacessível por seu nome correto na máquina que estava montando o compartilhamento.

A mvnão funcionou desde o nome retornado a partir do compartilhamento Samba para a expansão do padrão globbing não era o nome real do arquivo no sistema de arquivos hospedagem, apenas a própria versão mutilada de Samba do nome.

Sua solução foi efetuar login no servidor que realmente hospedou o arquivo (em um sistema de arquivos com regras de nomeação menos restritivas que o Samba) e alterar o nome do arquivo. Este foi o curso de ação correto.

Veja também o bate-papo sobre Unix e Linux sobre esta questão .

Kusalananda
fonte
-2

Antes de aprender a citar em shells unix, usava o diredmodo emacs para renomear ou excluir arquivos difíceis de combinar. Você simplesmente abre o diretório no emacs:

emacs -q .

... então você pode usar as teclas de seta para navegar até o arquivo com o qual deseja modificar e renomear o arquivo R. ?fornecerá a lista de comandos disponíveis (você também pode excluir arquivos difíceis de combinar).

Então você acaba de C-x C-csair do emacs e pronto.

Jim K.
fonte
-3

Geralmente, com nomes de arquivos incomuns, você pode adicionar "./" antes que o nome do arquivo e o Linux o reconheçam adequadamente. Por exemplo: $ ls ./?j?Z?R?C1_000c.jpg

besta
fonte