Como renomeio arquivos com caracteres estranhos?

5

Eu tenho um arquivo com caracteres gregos ou cirílicos.

Não é de minha propriedade, mas pelo usuário do servidor web (www).

Eu não posso usar o shell como o usuário do servidor web (www) ou como root, mas eu usei um script (executado pelo usuário do servidor web) para definir o diretório modbits para o 777 e o próprio arquivo para 666.

Não consigo renomear (ou excluir isso). Mesmo usando o inode e usando find falha:

$ ls -i1
19120017 Idezbox - коробка.jpeg

$ find . -inum 19120017 -exec mv -i {} sane \;
mv: cannot move './Idezbox - коробка.jpeg' to 'sane': No such file or directory

Caracteres curingas falham:

$ mv Idezbox*.jpeg sane
mv: cannot move 'Idezbox - коробка.jpeg' to 'sane': No such file or directory

O seguinte script Perl também falha:

find . -type f -print0 | \
perl -n0e '$new = $_; if($new =~ s/[^[:ascii:]]/x/g) {
  print("Renaming $_ to $new\n");
  rename($_, $new);
}'

Imprime:

Renaming Idezbox - коробка.jpeg to Idezbox - xxxxxxxxxxxxxx.jpeg

mas o comando renomear subseqüente não tem efeito.
No entanto, observe que há 7 caracteres gregos e 14 "x" -es.

Movendo-se para o diretório acima e tentando excluir "Junk":

$ rm -riv Junk
rm: descend into directory 'Junk'? yes
rm: cannot remove 'Junk/Idezbox - коробка.jpeg': No such file or directory

Alguma saída solicitada:

$ mount | grep "on /ifi/asgard/k00"
asgard:/ifi/asgard/k00 on /ifi/asgard/k00 type nfs (rw,tcp,rsize=32768,wsize=32768,hard,intr,addr=xxx.xxx.xxx.xxx)

$ df .
Filesystem           1K-blocks      Used Available Use% Mounted on
asgard:/ifi/asgard/k00
                     104857600  53201568  51656032  51% /ifi/asgard/k00
$ ls -al
total 88
drwxrwxrwx  2 www     ifiweb   4096 2014-08-11 14:16 .
drwxrwsrwx 14 inf5270 inf5270  4096 2014-08-11 14:15 ..
-rw-rw-rw-  1 www     ifiweb  35176 2012-04-14 13:38 Idezbox - коробка.jpeg
-rwxrw-r--  1 gisle   ifi-a     139 2014-08-11 14:15 perl-rename.sh

$ who ami i
gisle    pts/122      2014-08-11 11:37 (safir.ifi.uio.no:13.0)

Depois de ter lido todos os comentários e respostas (obrigado a todos!) Eu não acho mais que isso seja apenas sobre escapar ou citar os personagens cirílicos. Eu preciso olhar para o ângulo NFS.

Editar 2015-10-02:

O problema acabou sendo relacionado ao NFS. Como o arquivo foi criado diretamente em um volume montado pelo NFS, que eu acessei de outro computador, nada funcionou. Logar diretamente no servidor como root permitiu que um sysadmin (eu sou um mero usuário neste sistema específico e não pode fazer isso) para excluir o arquivo (usando algum método padrão para escapar dos caracteres gregos). Parabéns ao G-Man por me colocar no caminho certo (em um comentário). Se G-Man ainda estiver por perto e converter seu comentário em uma resposta, eu irei aceitá-lo.

    
por Free Radical 11.08.2014 / 13:30

5 respostas

2

Sua pergunta indica que este arquivo com problema está em um sistema de arquivos montado pelo NFS, e nada do seu cliente RHEL toca com êxito o arquivo. Isso sugere que o problema tem a ver com a interface entre seu cliente e o servidor NFS. Pode ser necessário fazer login diretamente no servidor para manipular o arquivo, ou pelo menos acessá-lo de uma estação de trabalho que executa um sistema operacional diferente.

    
por 02.10.2015 / 05:01
3

Eu sei que isso é antigo, mas se você quiser renomear um arquivo com caracteres estranhos, use:

find . -inum INODE -exec rename {} NEW_NAME \;

Então, neste caso, você poderia ter usado:

find . inum 19120017 -exec rename {} sane \;
    
por 01.10.2015 / 21:14
2

Não levando em conta a parte NFS do problema, alguns dias atrás eu tive um problema semelhante ao tentar excluir um arquivo sem nome / nome em branco. Bem, na verdade, não estava em branco - seu nome era o código octal para o caractere end of transmission ( echo4 ). Como foi criado lá, não tem ideia. No entanto, o que fiz para removê-lo foi xargs do nome do arquivo e, em seguida, transmiti-lo usando rm no comando Idezbox - коробка.jpeg4 .

  1. Primeiro, eu tenho o nome real executando

    ls -lb
    

    Isso mostrará o nome octal dos arquivos no diretório. Nesse caso, %code% .

  2. Então, eu corri algo assim:

    echo "
    ls -lb
    
    4" | xargs rm

Essa foi a minha solução alternativa - talvez você possa tentar algo como o acima, mas usando o nome do arquivo inteiro ( %code% ) em octal.

    
por 12.08.2014 / 07:08
0

Como solução alternativa, e se os arquivos forem distinguíveis pelos caracteres ascii, tente renomear o arquivo usando curingas, por exemplo

mv Idez*jpeg renamed.jpeg

    
por 12.08.2014 / 09:28
0

A resposta do @pacoseventeen estava basicamente correta, acho que você só precisa colocar as chaves entre aspas duplas. Eu não usaria renomear, pois isso é para renomear em massa.

find . -inum INODE -exec mv "{}" NEW_NAME \;

Eu só usei isso em um arquivo chamado ?? que ls -Q identificou como "\ 033 \ 033".

    
por 19.02.2016 / 19:43