Impossible de supprimer / déplacer des fichiers avec des caractères spéciaux dans le nom de fichier


17

Comme vous pouvez le voir ci-dessous, les fichiers ont des caractères rares.

capture d'écran du gestionnaire de fichiers

Les supprimer soit dans le terminal soit dans Dolphin renvoie l'erreur:

Aucun fichier ou répertoire de ce nom

L'exécution ls -lasur le répertoire m'a donné cette sortie:

-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

J'ai exécuté une fsckcommande sur la partition à partir d'un autre système d'exploitation, mais cela n'a rien changé.

Comment supprimer ces fichiers?


1
Avez-vous configuré votre système pour avoir un répertoire personnel chiffré?
dobey

@dobey je ne l'ai pas fait.
karjedavpalaa

5
@Panther Vous vous trompez. Ce n'est pas , en soi, une indication d'un système de fichiers corrompu, et même s'il a été provoqué par une corruption de données quelconque, fsck ne fera rien à ce sujet.
zwol


1
J'ai eu des fichiers avec des caractères non reconnus dans le nom. Renommer les fichiers a fonctionné. alors ils pourraient être supprimés.
ravery

Réponses:


35

Un moyen simple serait de supprimer ces fichiers par leur inode. :)

Utilisez ls -lidans le répertoire avec les caractères inhabituels pour afficher le numéro d'inode de chaque fichier, par exemple,

$ ls -li
total 0
133370 -rw-r--r-- 1 malte malte 0 Dec 30 19:00 ?2?.???љ?!?Gb??σ?[?F?
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

Ensuite, utilisez l' findutilitaire pour supprimer le fichier correspondant par son nom, en utilisant la syntaxe find <somepath> -inum <inode_number> -exec rm -i {} \;, comme dans l'exemple suivant:

$ find . -inum 133370 -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
$ ls -li
total 0
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

L' -ioption de rmn'est pas vraiment nécessaire, je viens de l'ajouter pour vous empêcher de supprimer accidentellement des fichiers que vous ne vouliez pas supprimer. :) Cela amène rmà demander une confirmation pour chaque fichier que vous souhaitez supprimer.

Si vous souhaitez supprimer plusieurs fichiers par leurs inodes, vous pouvez utiliser la syntaxe -o(sens ou ) pour find:

$ find .  \( -inum 133370 -o -inum 132584 \) -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
rm: remove regular empty file ‘./??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??’? y

Vous pouvez ajouter plus de numéros d'inode en étendant l'expression entre parenthèses avec plus d' -o -inum <inode_number>expressions.


4
Et alors rm -ri .?
Brent Baccala

Cela a fonctionné: find <somepath> -inum <inode_number> -exec rm -i {} \; Que font '-inum', '{}' et '\' dans la commande?
karjedavpalaa

Comment supprimer plusieurs fichiers en une seule fois? Merci aussi, vous avez fait ma journée!
karjedavpalaa

2
@BrentBaccala rm -ri .ne supprime cependant pas les fichiers par inode. Il récursera simplement dans tout le répertoire de travail et demandera chaque fichier si vous souhaitez le supprimer - et vous devez être très attentif aux fichiers qu'il demande afin de ne pas supprimer accidentellement les fichiers indésirables. Je ne voudrais certainement pas utiliser cette commande pour mon répertoire personnel - elle contient BEAUCOUP de fichiers. ;)
Malte Skoruppa

3
@karjedavpalaa (1) -inumindique findde rechercher des fichiers par leur numéro d'inode. (2) {}correspond au (x) fichier (s) trouvé (s) par grep. (3) \ échappe au ;symbole qui termine la commande passée à l' -execoption de find. (4) J'ai modifié ma réponse pour expliquer comment supprimer plusieurs fichiers en une seule fois.
Malte Skoruppa

13

Il est important de comprendre que ce n'est pas le type de «corruption du système de fichiers» qui vous fsckaidera. En ce qui concerne le système de fichiers, les noms de fichiers peuvent être n'importe quelle séquence d'octets , tant qu'aucun octet unique n'a la valeur 0x00 (ASCII NUL, marqueur de fin de chaîne C) ou 0x2F ( /, le séparateur de répertoire). (Si un nom de fichier contient en quelque sorte un octet 00 ou 2F, fsckdevrait résoudre ce problème.)

Au lieu de cela, ce que vous avez, ce sont des noms de fichiers qui, selon Dolphin, lscontiennent des caractères qui ne sont pas affichables dans votre "locale", il les remplace donc par des caractères d'espace réservé. Vous ne pouvez pas taper ces caractères non plus, il est donc plus difficile de manipuler les fichiers, mais vous pouvez le faire tant que vous le faites sans jamais taper ou copier et coller le nom. Par exemple, si vous supprimez ou renommez les fichiers problématiques directement depuis Dolphin, cela devrait fonctionner (j'irais jusqu'à dire que si cela ne fonctionne pas, c'est un bogue dans Dolphin).

Si vous devez faire quelque chose à leur sujet à partir du shell (par exemple, s'ils appartiennent à rootet ne peuvent donc pas être modifiés par un programme GUI), vous pouvez les nommer indirectement en utilisant des modèles "glob", qui seront développés dans la séquence correcte (s) d'octets et transmis.

Maintenant, bien sûr, vous ne voudriez pas supprimer des éléments par accident parce que votre modèle global correspond trop, donc ma recommandation serait d'utiliser l' renameutilitaire Perl pour convertir chaque nom de fichier en son codage hexadécimal:

$ rename '$_ = unpack("H*", $_)' *

Cela ne détruit aucune information - ni le fichier lui-même, ni la signification qui aurait pu à l'origine avoir été encodée dans le nom de fichier avant qu'il ne soit modifié. Il peut être annulé pour des fichiers spécifiques avec par exemple

$ rename '$_ = pack("H*", $_)' 696d706f7274616e742e646f63

Attention: il y a deux programmes nommés rename, d'origines différentes; les commandes ci-dessus ne fonctionneront qu'avec celle provenant de Perl. Dans Ubuntu, celui que vous voulez est celui du paquet "renommer", pas celui du paquet "util-linux". rename -hdistinguera: c'est ce que vous voulez ...

$ rename -h
Usage:
    rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E perlexpr]*|perlexpr
    [ files ]
# ...

... Ce n'est pas ce que tu veux ...

$ rename -h

Usage:
 rename [options] <expression> <replacement> <file>...
# ...

La chose clé à rechercher est "perlexpr". Vous pourriez avoir une ancienne version du renommage Perl qui ne comprend pas toutes les options ci-dessus, mais la commande que j'ai montrée devrait toujours fonctionner.

Edit: Sous 14.04 .5, le script perl inclus pour renamene prend pas en charge le commutateur -h. Vous pouvez confirmer que vous avez la bonne en vérifiant sa page de manuel, man renameauquel cas la ligne supérieure contiendra:

RENAME (1) Guide de référence des programmeurs Perl RENAME (1)


rename --version Option inconnue: version
Elder Geek

@ElderGeek Qu'est-ce que l' file $(which rename)impression? (Assurez-vous que le filepackage est installé en premier.)
zwol

/usr/bin/rename: symbolic link to /etc/alternatives/rename( fileest installé par défaut) En fait, vous devez rechercher les liens symboliques pour l'obtenir, /usr/bin/file-rename: a /usr/bin/perl -w script, ASCII text executable mais man renamec'est une indication plus rapide ...
Elder Geek

@ElderGeek Si c'est un script perl, alors c'est probablement une version plus ancienne de "celui qui provient de Perl", qui ne supporte pas --version; la commande que j'ai suggérée devrait toujours fonctionner. (/usr/share/doc/rename/changelog.gz sur mon ordinateur, qui exécute Debian unstable, indique qu'il a --versionété ajouté dans la version 0.10 du changement de nom Perl, en 2013. Je suis surpris qu'Ubuntu envoie toujours quelque chose de plus ancien que cela, mais ce programme n'a pas changé sa fonctionnalité depuis 2007 (!) donc ça va.)
zwol

Ah! Cela explique la confusion. Malgré de nombreuses affirmations contraires, Debian n'est pas Ubuntu. Je ne peux pas parler pour chaque version, mais certaines versions actuellement prises en charge d'Ubuntu LTS (14.04) n'en ont toujours pas. (Bien que le 16.04 le fasse)
Elder Geek
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.