Caractere não reconhecido no nome do arquivo (linux)

3

Eu tenho um problema ao acessar o arquivo no linux Mint. A razão é obviamente o caracter não reconhecido no nome do arquivo, mas nenhuma das técnicas que conheço me ajudou a renomeá-lo.

Então, aqui estão os detalhes: filename é algo como:

êà_0_4àíòè_0_7-_0_7_0_8ó_0_1à333333.mp3

ou pelo menos é assim que meu gerenciador de arquivos e terminal o exibem.

Não consigo abrir o arquivo com qualquer programa que eu use no Linux Mint. players de mídia, etc ...

Não pode ser renomeado, movido ou copiado via gerenciador de arquivos. Todas essas operações produzem mensagens de erro semelhantes a estas:

(para renomear):

Error renaming file: No such file or directory.

(para copiar / mover):

No such file or directory.

Eu também tentei renomear o comando do terminal usando curingas. O comando escolhe corretamente o nome do arquivo, mas não pode copiar, aqui está a saída:

cp *0_7-_* 1.mp3
cp: cannot open 'êà_0_4àíòè_0_7-_0_7_0_8ó_0_1à333333.mp3' for reading: No such file or directory

Eu também tentei usar o comando mv,

mv *0_7-_* 1.mp3
mv: cannot move 'êà_0_4àíòè_0_7-_0_7_0_8ó_0_1à333333.mp3' to '1.mp3': No such file or directory

Se eu tentar sudo renomear , obtenho:

Unrecognized character \xC3; marked by <-- HERE after <-- HERE near column 1 at (eval 1) line 1.

O arquivo em si é um arquivo MP3 válido. Pode ser aberto pelo Windows Media Player no XP.

O problema é: eu tenho uma grande biblioteca de músicas (acima de 100Gb) e há poucos tipos de arquivos similares com caracteres inválidos em nomes. Eu não quero perder esses arquivos e gostaria de descobrir como lidar com tais situações no futuro (no Linux, de preferência, porque eu não possuo um pc que roda o windows).

Qualquer ajuda será apreciada

ATUALIZAÇÃO: conforme solicitado por terdon, aqui está o outout de locale :

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

UPDATE 2 Acabei de verificar com meus amigos a máquina XP. E eu posso confirmar as seguintes descobertas. O arquivo original pode ser reproduzido pelo Windows Media Player, mas não pode ser reproduzido pelo Winamp. No entanto, depois de acessá-lo e renomeá-lo através do gerenciador de arquivos, ele é reproduzido por ambos os jogadores.

Portanto, concluo que este é um problema com caracteres não reconhecidos. Ainda estou interessado em solução no linux,

    
por Art Gertner 28.12.2013 / 13:00

2 respostas

2

Quatro coisas:

Experimente o complemento da solução - mova tudo o mais e remova tudo.

mkdir ../everything_else
mv problematic/folder/path/* everything_else
sudo rm -rf problematic/folder/path

Verifique se não há nenhuma ACL no arquivo e remova qualquer problema que possa estar causando isso:

$ /bin/ls -le problematic/folder/path
total 16
-rw-r--r--+ 1 whmcclos  staff  1918 Dec 18 09:00 README
0: user:_spotlight inherited allow read,execute,readattr,readextattr,readsecurity
$ chmod -a "..."

Tente um script Perl para suavizar as dependências de nomes do OS / FS?

Por exemplo, algo nos moldes deste fragmento de código - mantenha o nome do arquivo em anônimo $ _:

$ mkdir fred; cd fred; touch a b c d e f
$ cat > try.pl
#!/usr/bin/perl
opendir(D,".") or die "cannot open .\n";
@files=readdir(D);
closedir(D);
foreach (@files) {
  next if /\.{1,2}/;                      # Skip directory entries
  print; print "? "; $r = <>; chop($r);   # Provide some level of control
  if($r eq "y" or $r eq "Y") {unlink;}    # Should report if cannot unlink unnamed file - tbd.
}
^D
$ /usr/bin/perl try.pl
a? 
b? 
c? y
d? 
e? 
f? 
$ ls
a       b       d       e       f       try.pl

[Atualizado para refletir a intenção original do autor - copie a besta para um arquivo bem comportado (nome):]

Para ver se o Perl pode copiar o arquivo comportado incorretamente para um arquivo bem comportado, eu usaria o script Perl abaixo - ainda ao longo das linhas acima - deixe o Perl acessar "anonimamente" o nome do arquivo.

(Além disso, a ACL deve realmente ser verificada; a ACL pode até impedir que o root acesse normalmente o arquivo como root, pelo que me lembro de ter lidado.]

Aqui está o script Perl:

$ cat try3.pl
#!/usr/bin/perl
# A code fragment to ask to copy a displayed file to $TO; chg $TO on next line:
$TO="my_new_behaved_filename";       # This is the name that will be copied to
opendir(D,".") or die "cannot open .\n";
@files=readdir(D);
closedir(D);
foreach $f (@files) {
  next if $f =~ /\.{1,2}/;           # Skip directory entries, "." & ".."
  print "$f? "; $r = <>; chop($r);   # Provide some level of control; "y" or "Y"
  if($r eq "y" or $r eq "Y") {       #   to copy the displayed filename to $TO
    print "copying it to $TO...\n";
    # Now, see if we can copy the darn thing to $TO:
    open(FROM,$f) or die "sorry - couldn't open it...";
    open(TO,">$TO");
    while(read FROM, $buf, 16384) {
      print TO $buf;
    }
    close(TO);
    close(FROM);
  }
}

Que você usaria como tal, assumindo que o try3.pl é o script Perl mencionado acima:

$ ./try3.pl 
a? 
b? 
d? y
copying it to my_new_behaved_filename...
e? 
f? 

Acesse o arquivo por meio de um link simbólico ou físico e veja a milhagem que você recebe.

Eu usaria a expansão do nome de arquivo [tab] do vi para tentar "identificar" no shell que arquivo você deseja vincular.

Mudei meu ~ / {.vim, .viminfo, .vimrc} para o lado para restringir as coisas, como a entrada do wildmenu. Você pode querer fazer o mesmo.

Agora, inicie a seguinte seqüência de linha de comando na pasta que contém o arquivo falso:

$ vi

No vi, digite com precisão essa sequência de caracteres

!!ln -s [tab]

Essa sequência de teclas era, em palavras: ponto de exclamação, ponto de exclamação, el, en, branco, traço, es, em branco, tab. Assim que você pressionar a tecla [tab], o primeiro arquivo do diretório de trabalho atual deve ser exibido após o caractere em branco (seguindo o "s") na linha de status do vi. Pressione a tecla [tab] várias vezes para percorrer o nome do arquivo falso. Quando o nome do arquivo falso aparecer, pressione a barra de espaço para adicionar um espaço e, em seguida, digite um novo nome de arquivo / link.

O resultado na linha de status do vi deve ser parecido com isto

!!ln -s bogus_filename new_sym_link_name

Pressione a tecla return para ver se o comando link (gerado do vi substitui a linha nula atual no buffer vazio do vi, que não nos importamos aqui; queremos o efeito colateral de executar um comando shell com tab expansão) criará o link new_sym_link_name.

Saia do vi com: q! [return], e veja se consegue acessar seu arquivo através do link simbólico.

(Você também pode tentar um link físico deixando os -s no comando ln acima.

Porque eu notei que você poderia mudar o nome do arquivo através do Windows, estou pensando que de alguma forma, uma seqüência de alimentação de linha de retorno de carro entrou no nome do arquivo, e isso está confundindo as várias abordagens.

    
por 28.12.2013 / 20:57
1

Use ls -li para obter o número de inode do arquivo em questão. Anote o número do inode (primeiro campo). Vou usar 123456 como exemplo.

Em seguida, use find para remover o arquivo:

find -inum 123456 -exec rm {} \;

ou para renomeá-lo:

find -inum 123456 -exec mv {} some_better_filename \;
    
por 28.12.2013 / 21:01