Supprimer un fichier sous Linux en utilisant le numéro d'inode

14

Si vous créez un fichier sous UNIX / Linux avec des caractères spéciaux, tels que touch \"la*, vous ne pouvez pas le supprimer avec rm "la*. Vous devez utiliser le numéro d'inode (vous pouvez si vous ajoutez le \avant le nom, je sais, mais vous devez deviner en tant qu'utilisateur qu'il a été utilisé dans la création du fichier).

J'ai vérifié la page de manuel pour rm, mais il n'y a aucune mention du numéro d'inode. Faire rm inodenumberne marche pas non plus.

Quelle est la commande pour cela?

KdgDev
la source

Réponses:

23

Certaines autres méthodes comprennent:

échapper aux caractères spéciaux:

[~] $ rm \ "la \ *

utilisez la commande find et recherchez uniquement le répertoire courant. La commande find peut rechercher des numéros d'inode et dispose d'un -deletecommutateur pratique :

[~] $ ls -i
7404301 "la *

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

[~] $ find. -maxdepth 1 -type f -inum 7404301 -delete
[~] $ ls -i
[~] $
John T
la source
Hé, utiliser find serait certainement plus facile que ma suggestion, je n'avais jamais remarqué -inum :)
Find a beaucoup d'excellents commutateurs à explorer, c'est mon outil de couteau suisse pour être honnête :)
John T
t: oh si vrai.
akira
Solaris n'a pas les options "-delete" ou "-maxdepth".
guthrie
Vous devez limiter la recherche avec l' -xdevoption car d'autres systèmes de fichiers montés peuvent également avoir des fichiers non liés avec le même numéro d'inode.
Jonas Berlin
5

Peut-être que je manque quelque chose, mais ...

rm '"la*'

Quoi qu'il en soit, les noms de fichiers n'ont pas d'inodes, les fichiers en ont. Essayer de supprimer un fichier sans supprimer tous les noms de fichiers qui pointent vers lui endommagera votre système de fichiers.

Ignacio Vazquez-Abrams
la source
eh bien, cela ne fonctionnerait que pour le répertoire actuel, mais c'est en effet un motif de préoccupation valable. Stupide d'avoir raté ça. Mais ne supprime toujours pas le fichier.
KdgDev
3
Bien sûr que non. Le fichier est supprimé uniquement lorsqu'il n'y a plus de noms de fichiers pointant vers lui et qu'aucun processus ne le maintient ouvert.
Ignacio Vazquez-Abrams
5

Si vous voulez vraiment le faire - et que votre cas d'utilisation ne semble pas vraiment du tout nécessaire, vous pouvez essayer des outils de débogage du système de fichiers. Si vous êtes prêt à tout perdre, bien sûr.

Par exemple, pour ext2 / debugfs3/4, la commande a une option "kill_file" qui semble prendre un inode. Comme mentionné dans d' autres réponses, cela va endommager votre système de fichiers, car il y aura des entrées de répertoire pointant vers un fichier inexistant. L'exécution fsckultérieure peut être en mesure de réparer cela. Il est peu probable que vous puissiez le faire sur un système de fichiers monté.

Mais je vous recommande fortement d'utiliser simplement des échappements / guillemets appropriés et de supprimer ces fichiers avec la rmcommande régulière comme mentionné dans une réponse précédente - et d'utiliser rm -ipour plus de sécurité lorsque vous traitez des noms de fichiers contenant des caractères globbing comme *


la source
1

Bien que je recommande fortement l'approche "échapper aux caractères spéciaux", il y a toujours la clricommande lorsque vous voulez vraiment une corruption du système de fichiers réparable.

mpez0
la source
2
Il convient de noter qu'il clrin'est généralement présent que sur les systèmes Oracle (par exemple SunOS).
can-ned_food
1

Vous pouvez supprimer des fichiers commençant par un tiret en appelant rm -- filename.

uli42
la source
1
Cela semble être un commentaire sur cette réponse plutôt qu'une réponse à la question du PO.
Je dis Reinstate Monica
1

Le défi que j'avais était de supprimer un nom de fichier qui commence par un tiret - rm veut toujours l'interpréter comme un nom d'hôte. J'ai résolu cela en utilisant:

rm ./-g4xxx
Anthony V Edwards
la source