Como você pode ver abaixo, os arquivos têm caracteres incomuns.
Excluí-los no terminal ou no Dolphin retorna o erro:
Não existe tal arquivo ou diretório
A execução ls -la
no diretório me deu esta saída:
-rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 ??
-rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 ?2?.???љ?!?Gb??σ?[?F?
-rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??
-rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 3l??#g?w????O?JKB7?co??քH??bT?NA???S???X?I?A?qC??M?I???
-rw-rw-r-- 1 aalap aalap 0 Nov 14 01:05 ??8??-?@,?Zp?[?bI????7^?ñ[?ڏ??z?O???ч??eEȰ?+??,OF??h
Eu executei um fsck
comando na partição de outro sistema operacional, mas isso não mudou nada.
Como faço para remover esses arquivos?
files
filesystem
encoding
filename
karjedavpalaa
fonte
fonte
Respostas:
Uma maneira simples seria remover esses arquivos por seu inode. :)
Use
ls -li
no diretório com caracteres incomuns para mostrar o número de inode de cada arquivo, por exemplo,Em seguida, use o
find
utilitário para excluir o arquivo correspondente por seu nome, usando a sintaxefind <somepath> -inum <inode_number> -exec rm -i {} \;
, como no exemplo a seguir:A
-i
opção pararm
não é realmente necessária, eu apenas a adicionei para impedir que você acidentalmente remova arquivos que não pretendia remover. :) Faz comrm
que solicite confirmação para cada arquivo que você deseja excluir.Se você deseja remover vários arquivos por seus inodes, pode usar a sintaxe
-o
(meaning or ) parafind
:Você pode adicionar mais números de inode estendendo a expressão entre parênteses com mais
-o -inum <inode_number>
expressões.fonte
rm -ri .
?rm -ri .
não está excluindo arquivos por inode, no entanto. Ele simplesmente percorre todo o diretório de trabalho e solicita cada arquivo se você deseja removê-lo - e você precisa estar muito atento aos arquivos que está solicitando para não remover acidentalmente os indesejados. Eu certamente não gostaria de usar este comando para o meu diretório pessoal - ele contém MUITOS arquivos. ;)-inum
dizfind
para procurar arquivos pelo número de inode. (2){}
corresponde ao (s) arquivo (s) encontrado (s) porgrep
. (3) \ escapa o;
símbolo que termina o comando passado para a-exec
opção defind
. (4) Editei minha resposta para explicar como remover vários arquivos de uma só vez.É importante entender que esse não é o tipo de "corrupção do sistema de arquivos" que
fsck
ajudará. No que diz respeito ao sistema de arquivos, os nomes dos arquivos podem ter qualquer sequência de bytes , desde que nenhum byte único tenha o valor 0x00 (ASCII NUL, marcador de fim de cadeia C) ou 0x2F (/
o separador de diretório). (Se, de alguma forma, um nome de arquivo tiver um byte de 00 ou 2F incorporado,fsck
deve-se corrigir isso.)Em vez disso, o que você tem são nomes de arquivos que o software aplicativo (Dolphin
ls
) acham que contêm caracteres que não são exibidos no seu "código do idioma", por isso os substitui por caracteres de espaço reservado. Você também não pode digitar esses caracteres, portanto, manipular os arquivos é mais difícil, mas você pode fazê-lo desde que sem digitar ou copiar e colar o nome. Por exemplo, se você excluir ou renomear os arquivos com problemas diretamente no Dolphin, isso deve funcionar (eu diria que, se não funcionar, é um bug no Dolphin).Se você precisar fazer algo sobre eles a partir do shell (por exemplo, se eles pertencem
root
e, portanto, não podem ser modificados por um programa GUI), você pode nomeá-los indiretamente usando padrões "glob", que serão expandidos para a sequência correta (s) de bytes e transmitidos.Agora, é claro, você não gostaria de excluir coisas por acidente, porque seu padrão glob correspondia muito, então minha recomendação seria usar o
rename
utilitário Perl para converter cada nome de arquivo em sua codificação hexadecimal:Isso não destrói nenhuma informação - nem o próprio arquivo, nem qualquer significado que possa ter sido originalmente codificado no nome do arquivo antes de ser confundido. Pode ser desfeito para arquivos específicos com
Cuidado: existem dois programas nomeados
rename
, de origens diferentes; os comandos acima funcionarão apenas com o originado no Perl. No Ubuntu, o que você deseja é aquele do pacote "renomear", não o pacote "util-linux".rename -h
vai distinguir: é isso que você quer ...... não é isso que você quer ...
A principal coisa a procurar é "perlexpr". Você pode ter uma versão mais antiga do renomear Perl que não entende todas as opções acima, mas o comando que eu mostrei ainda deve funcionar.
Edit: Sob 14.04 .5, o script perl incluído para
rename
não suporta a opção -h. Você pode confirmar que possui a correta, verificando sua página de manual eman rename
, nesse caso, a linha superior conterá:fonte
file $(which rename)
imprime? (Certifique-se de ter ofile
pacote instalado, em primeiro lugar.)/usr/bin/rename: symbolic link to /etc/alternatives/rename
(file
É instalado por padrão) Na verdade você tem que perseguir os links simbólicos para chegar/usr/bin/file-rename: a /usr/bin/perl -w script, ASCII text executable
, masman rename
é uma indicação mais rápido ...--version
; o comando que sugeri ainda deve funcionar. (/usr/share/doc/rename/changelog.gz no meu computador, que executa o Debian instável, indica que--version
foi adicionado na versão 0.10 da renomeação do Perl, em 2013. Estou surpreso que o Ubuntu ainda esteja enviando algo mais antigo que isso, mas este programa não tem realmente mudou a sua funcionalidade (!) desde 2007 por isso é bom).