Quero renomear um 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
Tentei usar o número do inode conforme recomendado em alguns lugares na 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?
Responder1
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 ls
mostrar pontos de interrogação é apenas porque ele não pode exibir alguns dos caracteres do nome do arquivo na localidade atual (que é uma das razões pelas quaisvocê deve evitar analisar a saída dels
).
No entanto, com um compartilhamento Samba, você aparentemente tem requisitos mais rígidos em nomes de arquivos do que em um sistema de arquivos Unix padrão.
Como o nome do arquivo era "ilegal" no compartilhamento intermediário do Samba, o arquivo estava inacessível pelo nome correto na máquina que estava montando o compartilhamento.
Isso mv
não funcionou, pois o nome retornado do compartilhamento do Samba para a expansão do padrão globbing não era o nome real do arquivo no sistema de arquivos de hospedagem, apenas a versão distorcida do nome do próprio Samba.
Sua solução foi fazer login no servidor que realmente hospedava o arquivo (em um sistema de arquivos com regras de nomenclatura menos restritivas que o Samba) e alterar o nome do arquivo lá. Este foi o curso de ação correto.
Veja também o Unix&Linuxconversar sobre esta questão.
Responder2
Antes de aprender sobre cotações em shells Unix, eu usaria dired
o modo do 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 que deseja modificar e renomear o arquivo com R
. ?
fornecerá a lista de comandos disponíveis (você também pode excluir arquivos difíceis de combinar).
Então você C-x C-c
sai do emacs e pronto.
Responder3
Freqüentemente, com nomes de arquivos incomuns, você pode adicionar "./" antes do nome do arquivo e o Linux o reconhecerá corretamente. Por exemplo: $ls./?j?Z?R?C1_000c.jpg