Remova um arquivo no Linux usando o número do inode

14

Se você criar um arquivo no UNIX / Linux com caracteres especiais, como touch \"la*, não poderá removê-lo rm "la*. Você precisa usar o número do inode (você pode, se adicionar o \nome anterior, eu sei, mas você teria que adivinhar como usuário que foi usado na criação do arquivo).

Eu verifiquei a página de manual quanto à rm, mas não há menção ao número do inode. Fazer rm inodenumbertambém não funciona.

Qual é o comando para isso?

KdgDev
fonte

Respostas:

23

Alguns outros métodos incluem:

escapando dos caracteres especiais:

[~] $ rm \ "la \ *

use o comando find e pesquise apenas o diretório atual. O comando find pode procurar números de inode e possui uma -deleteopção útil :

[~] $ ls -i
7404301 "la *

[~] $ find. -maxdepth 1 -type f -inum 7404301
./"la*

[~] $ find. -maxdepth 1 -type f -inum 7404301 -delete
[~] $ ls -i
[~] $
John T
fonte
Heh, usando find seria certamente mais fácil do que a minha sugestão, eu nunca tinha notado -inum :)
Find tem um monte de grandes interruptores para ser explorado, é a minha ferramenta canivete suíço para ser completamente honesto :)
John T
t: oh, é verdade.
Akira
O Solaris não tem as opções "-delete" das "-maxdepth".
Guthrie
Você deve limitar a pesquisa com a -xdevopção, pois outros sistemas de arquivos montados também podem ter arquivos não relacionados com o mesmo número de inode.
Jonas Berlin
5

Talvez esteja faltando alguma coisa, mas ...

rm '"la*'

De qualquer forma, os nomes de arquivos não têm inodes, os arquivos. Tentar remover um arquivo sem remover todos os nomes de arquivos que apontam para ele danificará o sistema de arquivos.

Ignacio Vazquez-Abrams
fonte
bem, isso funcionaria apenas para o diretório atual, mas é realmente um motivo válido de preocupação. Estúpido que eu senti falta disso. Ainda não remove o arquivo.
KdgDev 19/05
3
Claro que não. O arquivo é removido apenas quando não há mais nomes de arquivos apontando para ele e nenhum processo mantendo-o aberto.
Ignacio Vazquez-Abrams
5

Se você realmente deseja fazer isso - e seu caso de uso não parece realmente necessário, tente as ferramentas de depuração do sistema de arquivos. Se você está disposto a perder tudo, é isso.

Por exemplo, para ext2 / debugfs3/4, o comando possui uma opção "kill_file" que parece receber um inode. Como mencionado em outras respostas, isso irá danificar o seu sistema de arquivos, uma vez que haverá entradas de diretório apontando para um arquivo inexistente. A execução fsckposterior poderá consertar isso. É improvável que você possa fazer isso em um sistema de arquivos montado.

Mas eu recomendo fortemente que você use escape / citação apropriado e exclua esses arquivos com o rmcomando regular, conforme mencionado em uma resposta anterior - e use rm -ipara obter segurança extra ao lidar com nomes de arquivos que contenham caracteres brilhantes como *


fonte
1

Embora eu recomendo fortemente a abordagem "escapar dos caracteres especiais", sempre há o clricomando quando você realmente deseja corrupção do sistema de arquivos corrigível.

mpez0
fonte
2
Deve-se notar que clrigeralmente está presente apenas nos sistemas Oracle (por exemplo, SunOS).
can-ned_food
1

Você pode excluir arquivos começando com um traço ligando para rm -- filename.

uli42
fonte
1
Parece ser um comentário sobre esta resposta e não uma resposta à pergunta do OP.
Eu digo Restabelecer Monica
1

O desafio que tive foi remover um nome de arquivo que começa com um traço - a rm sempre quer interpretá-lo como um nome de host. Eu resolvi isso usando:

rm ./-g4xxx
Anthony V Edwards
fonte