Apagar um arquivo corrompido no Linux

5

Como posso excluir este arquivo? Eu acho que é um arquivo corrompido em um sistema de arquivos VFAT.

?????????  ? ?       ?        ?            ? 100.jpg
    
por 3498DB 09.10.2010 / 08:32

6 respostas

4

Uma possibilidade é descobrir o número inode do arquivo, o que você pode fazer executando ls -i . Isso retornará duas colunas - sendo a primeira o inode e a segunda o nome do arquivo. Em seguida, você pode usar o comando find para selecionar apenas o arquivo com esse inode específico e excluí-lo.

sh-4.1$ ls -i .
  17921 somefile.ods
    169 someotherfile.conf
    305 -????????? ? ? ? ? ? 100.jpg
  18048 yetanotherfile.jpg

sh-4.1$ find . -maxdepth 1 -inum 305 -ok rm '{}' \;
< rm ... -????????? ? ? ? ? ? 100.jpg > ? y

Como o inode provavelmente é exclusivo do arquivo (assumindo que não há hardlinks), isso permitirá que você exclua sem os riscos inerentes aos curingas. As opções maxdepth e ok do comando find apenas tornam menos provável que você acerte o arquivo errado por acidente.

    
por 09.10.2010 / 09:18
3

Eu recomendaria uma versão um pouco mais defensiva da sugestão do cHao:

rm -i ./*100.jpg*

O -i faz com que rm pergunte se deseja ou não excluir cada arquivo que corresponda ao curinga; Isso garante que você não excluirá acidentalmente outros arquivos também. E o principal ./ garante que todos os nomes de arquivos serão tratados como nomes de arquivos e não mais opções para rm (parece que você pode ter uma vantagem, é por isso que isso é importante) .

É possível, a propósito, que existam caracteres invisíveis dentro da string "100.jpg". Se acima, você receber uma mensagem de erro como " rm: ./*100.jpg*: not found ", é por isso. ls -1fw | cat -v pode ser útil.

    
por 09.10.2010 / 08:56
3

Não tenho certeza se alguma das respostas aqui teve o problema relatado por Stig. Eu acabei de me deparar com este problema no meu sistema de arquivos ext4:

# ls -l /tmp/dependencies/
ls: cannot access /tmp/dependencies/easy-rsa-master: No such file or directory
total 0
?????????? ? ? ? ?            ? easy-rsa-master

# ls -i /tmp/dependencies/
ls: cannot access /tmp/dependencies/easy-rsa-master: No such file or directory
? easy-rsa-master

# rm -r /tmp/dependencies
rm: descend into directory ‘dependencies’? y
rm: cannot remove ‘/tmp/dependencies/easy-rsa-master’: No such file or directory
rm: remove directory ‘dependencies’? y
rm: cannot remove ‘dependencies’: Directory not empty

O arquivo em si estava corrompido junto com seus atributos de arquivo. ls -i mostra claramente nenhum ID inode. Nenhum uso de rm fará o truque. Mesmo rm -rf atravessa o diretório e tenta excluir o arquivo diretamente (e silenciosamente).

Minha solução foi recriar o diretório sem o arquivo ofensivo. Então você pode mover o diretório para outro local, como / tmp. Ele será removido após uma reinicialização ou sempre que sua distro limpar o diretório / tmp (esperançosamente).

    
por 09.02.2016 / 04:25
0

Você pode tentar

rm *100.jpg*

Os? s são pontos de interrogação literais ou caracteres que não fazem sentido. De qualquer maneira, o próprio sistema operacional (e o shell) pode geralmente remover o arquivo, se o sistema de arquivos não for escolhido.

Se o sistema de arquivos é confuso, a exclusão de coisas pode piorar. Eu recomendo que você inicialize no Windows para verificar a unidade e exclua o arquivo, se puder.

    
por 09.10.2010 / 08:49
0

Você pode tentar isso:

  1. Renomeie seu diretório.
  2. Recrie o diretório original (vazio).
  3. Copie outros arquivos de volta para ele.
  4. Exclua o diretório que contém esse arquivo.
por 09.10.2010 / 09:03
0

Se você quiser excluir todos os arquivos corrompidos, faça o seguinte:

ls -1 | grep -P "[\x80-\xFF]" | xargs rm

Acima dos arquivos grep do comando grep que tem caracteres não ASCII.

    
por 21.12.2012 / 09:40