Effacer un fichier au nom bizarre
Posted by Daniel on 09 Nov 2009 at 09:00 | Tagged as: unix
Il arrive sous Unix que l'on rencontre des fichiers aux noms inhabituels. Ces fichiers sont souvent le produit d'une erreur humaine (faute de frappe, erreur dans une commande), et on a parfois bien du mal à les effacer. Voici donc une petite solution toute simple qui devrait marcher dans tous les cas...
Le plus simple et le plus naturel pour effacer un fichier est d'utiliser la commande rm, avec simplement quelques précautions supplémentaires au niveau des arguments qu'on va lui donner. Prenons l'exemple d'un fichier dont le nom est simplement "-" (un tiret) :
$ ls - $ rm - usage: rm [-fiRr] file ...
On le voit, rm n'est pas content, et il ne se prive pas de le dire. Dans notre exemple, rm a tout simplement interprété le "-" comme le préfixe d'une option, mais ne trouvant pas de caractère, il considère à juste titre que l'option n'est pas valide. Dans un certain nombre de cas, on peut s'en tirer en mettant le nom du fichier à effacer entre guillemets, ou même entre apostrophes (single quotes) pour éviter toute interprétation, mais ça ne marche pas systématiquement, pas plus que l'utilisation d'un antislash pour protéger le caractère gênant, comme le montrent les exemples suivants (pris sur un serveur Solaris 10) :
$ rm '-' usage: rm [-fiRr] file ... $ rm "-" usage: rm [-fiRr] file ... $ rm \- usage: rm [-fiRr] file ...
Une solution fonctionnelle dans cet exemple précis est de passer --
en argument à rm, pour lui dire que tous les arguments suivants sont de vrais arguments et pas des options :
$ rm -- - $ ls $
Cependant, la solution la plus généralisable est de passer par l'inode du fichier, et d'utiliser la commande find :
$ ls -i 91337 - $ find ./ -inum 91337 ./-
Une fois qu'on connaît le numéro d'inode, et qu'on sait le faire retrouver par find, on n'a plus qu'à lui demander de l'effacer :
$ find ./ -inum 91337 -exec rm {} \; $ ls $
Et voilà, quels que soient les caractères problématiques dans le nom du fichier, on s'en moque, puisqu'on passe uniquement par la référence de son inode.