Como remover um arquivo em que o nome do arquivo tenha problemas de caractere utf-8

3

Eu quero remover um arquivo de um servidor através do comando bash rm .

Este é um arquivo de amostra Test_ Mürz.jgp .

Como é possível remover arquivos com esses problemas de caracteres no nome do arquivo em grande escala ... especialmente quando você não sabe a posição dos caracteres.

    
por mahatmanich 10.09.2013 / 13:07

5 respostas

14

Para arquivos únicos ou pequenos conjuntos de arquivos, se o curinga não permitir a precisão que você precisa, você pode combinar ls -i (ou stat , se disponível) e find -inum .

Por segurança, ao usar -inum de find, sempre use também -xdev para restringir a pesquisa a um único sistema de arquivos. Não fazer isso pode ter resultados inesperados.

Por exemplo:

~$ ls -i myweirdfile
183435818 myweirdfile
~$ find . -xdev -inum 183435818 -exec rm -i '{}' ';'
rm: remove regular file './myweirdfile'? y
~$

Como alternativa, em uma única chamada (isso pode depender do GNU coreutils stat, que deve ser uma suposição razoavelmente segura no Linux e usa a substituição do processo sh-style):

~$ find . -xdev -inum $(stat -c '%i' 'myweirdfile') -exec rm -i '{}' ';'
rm: remove regular file './myweirdfile'? y
~$

Você também pode usar a ação -delete do find em vez de -exec 'ing rm. Para nomes de arquivos muito estranhos, isso pode ser mais seguro. Use -print ou -ls primeiro para verificar qual arquivo será excluído. Algo como o seguinte:

~$ ls -i myweirdfile
183435818 myweirdfile
~$ find . -xdev -inum 183435818 -print
./myweirdfile
~$ find . -xdev -inum 183435818 -delete
~$ find . -xdev -inum 183435818 -print
~$

Tenha em mente que os hardlinks usam o mesmo número de inode para vários nomes, então você quer ter certeza de que não há nenhum nome adicional perdido em qualquer lugar que seja excluído também (a menos que você queira fazer isso, obviamente).

    
por 10.09.2013 / 15:05
4

Modo fácil:

ls -i Test_*

rm -i [inode number]
    
por 10.09.2013 / 14:20
2

Quais metas de "grande escala" você tem?

Por que isso não é suficiente?

$ rm Test_*

Uma maneira de mergulhar em uma árvore de diretórios de arquivos:

$ find /your/base/dir -maxdepth 3 -type f -name 'Test_*' -exec rm {} \;

Você pode ajustar o comando find para zero-in em seus arquivos.

    
por 10.09.2013 / 14:07
1

também podemos usar este comando rm ./"Test_ Mürz.jgp" para remover esses arquivos

    
por 10.07.2014 / 11:34
0

existem três métodos:

  1. use inode contra nome de arquivo. primeiro faça o comando ls e verifique o arquivo inode, descrito acima
  2. para manequins, use o Midnight Commander:)
  3. você deve escapar de caracteres especiais. espaço (_ para visualidade) _ você substitui como _ e outros caracteres.
  4. você pode usar a expansão do bash. No início, escreva início: rm Teste_ e pressione a tecla TAB. Eles expandem os caracteres de escape imediatamente para nomes exclusivos ou exibem possibilidades para você não exclusivos. Então você verá como deve escrever caracteres especiais na linha de comando.
  5. você pode escapar do unicode escapando: nome_do_seu \ 263 \ 261rest_of_name. você pode usar códigos de caracteres decimais para escapar.
por 10.07.2014 / 11:17

Tags