J'ai réussi à créer un fichier qui ne semble pas avoir un nom de fichier. J'ai trouvé des informations sur la façon d'obtenir plus de détails sur le fichier dans le fil suivant .
Cependant, j'ai essayé certaines des suggestions énumérées et n'arrive pas à supprimer le fichier. Je ne suis pas sûr de ce que j'ai fait pour le créer, mais c'est ce qui est arrivé en essayant de copier un fichier XML.
Quelques informations sur le fichier sont les suivantes:
> ls -lb
total 296
-rw-r--r-- 1 voyager endeavor 137627 Jan 12 12:49 \177
> file *
: XML document
> ls -i
417777
J'ai essayé de trouver l'aide du commutateur inum, puis de le diriger, car cela semblait être le moyen le plus sûr de s'en débarrasser. Cependant, l'exemple donné au bas du fil de discussion lié ci-dessous a échoué pour moi. Exemple:
> find -inum 41777 -exec ls -al {} \;
find: illegal option -- i
find: [-H | -L] path-list predicate-list
J'ai donc d'abord essayé d'utiliser la liste de chemins comme ci-dessous, mais cela n'a pas fonctionné non plus:
> find . -inum 41777 -exec ls -al {} \;
Je ne sais pas quel est le caractère \ 177 non imprimable ni comment je peux le transmettre à une rm
commande, mais je veux vraiment m'assurer de ne pas gâcher d'autres fichiers / répertoires dans ma tentative de suppression de ce fichier.
la source
\177
est leDEL
caractère ASCII .0
?Réponses:
Le fichier a un nom, mais il est composé de caractères non imprimables. Si vous utilisez ksh93, bash, zsh, mksh ou FreeBSD sh, vous pouvez essayer de le supprimer en spécifiant son nom non imprimable. Assurez-vous d'abord que le nom est correct avec:
ls -ld $'\177'
S'il affiche le bon fichier, utilisez ensuite rm:rm $'\177'
Une autre approche (un peu plus risquée) consiste à utiliser
rm -i -- *
. Avec l'option -i, rm requiert une confirmation avant de supprimer un fichier. Vous pouvez ainsi ignorer tous les fichiers que vous souhaitez conserver, sauf celui-ci.Bonne chance!
la source
rm -i *
n'aurait pas fonctionné dans ce cas; à cause des nouvelles lignes, le shell serait étendu*
à quelque chose quirm
ne serait pas reconnu comme nom de fichier.bash
- estimé et GNUrm
. Sur mon système,rm *
,rm -i *
etrm Ctrl-V DEL TAB ENTER
tout fonctionne correctement, même si le nom de fichier contient un caractère de nouvelle ligne (je"\177foo\nbar\n"
). Certaines commandes ne gèrent pas bien ces noms de fichiers, mais les outils GNU semblent robustes; les versions non GNU des mêmes outils pourraient ne pas se comporter aussi bien. Dans tous les cas, il est utile de connaître les différentes astuces de ces réponses.rm
ne fera jamais aucune forme de fractionnement de mots, qu'il s'agisse de GNUrm
ou non. Le shell développe les globs et, lorsqu'il exécute la commande appelée, il transmet les noms de fichiers résultants sous la forme d'arguments séparés par une valeur NULL (dans le code C). Ce qui est dangereux, c'est de diriger une liste de fichiers vers quelque chose qui utilise des nouvelles lignes comme délimiteurs; see Pourquoi la boucle sur la sortie de find est-elle une mauvaise pratique?Pour ceux qui l'utilisent,
vim
lancez-le dans le répertoire de travail actuel:et naviguez jusqu'au fichier avec les flèches ou
j/k
. Appuyez ensuite surShift+D
et confirmez la suppression avecy
.la source
Il existe probablement un moyen de transmettre le nom de fichier à
rm
, mais si vous craignez de perdre quoi que ce soit, vous pouvez utiliser un gestionnaire de fichiers à interface graphique. Emacs est livré avec un mode d’édition de répertoire que vous pouvez utiliser si vous l’avez installé:Ouvrez le dossier dans
emacs
. Vous pouvez exécuteremacs /path/to/folder
ou ouvrir emacs, appuyer sur Esc+ xet exécuterdired
, ce qui vous demandera le cheminhttp://so.mrozekma.com/unix-dired-delete1.png
Accédez à la ligne contenant le fichier à supprimer et appuyez sur d. Vous devriez voir un
D
dans la marge de gauche à côté du fichier:http://so.mrozekma.com/unix-dired-delete2.png
Appuyez sur xpour enregistrer vos modifications. Cela vous demandera de vous assurer que vous voulez supprimer le fichier; appuyez sur y:
http://so.mrozekma.com/unix-dired-delete3.png
la source
vim
exécutez-le dans le répertoire de travail actuel:vim ./
et naviguez jusqu'au fichier à l'aide des touches fléchées. Appuyez ensuite surShift+D
et confirmez la suppression avecy
.vim
soutenirVous avez déjà démontré avec
file *
le shell que glob (*
) est capable de récupérer ce fichier, donc maintenant faites unrm
glob sur ce glob.rm -i *
n
pour tous les fichiers sauf celui avec le nom de fichier apparemment invisiblela source
Le fichier a en fait un nom, mais il est composé de caractères non imprimables.
Une méthode simple consiste à s’appuyer sur l’achèvement du shell: appuyez sur Tabjusqu'à ce que le nom de fichier «étrange» soit inséré. Votre shell doit être configuré pour basculer entre les achèvements possibles:
menu-complete
, qui n'est pas lié par défaut, maiscomplete
qui est lié à Tabpar défaut. Vous pouvez également utiliser Esc *des insertions pour tous les fichiers et supprimer ceux que vous ne souhaitez pas supprimer de la ligne de commande.setopt auto_menu
ousetopt menu_complete
définir.Si l'achèvement n'est pas utile dans votre shell, vous pouvez appeler
rm -i -- *
et répondre «non» à l'exception de ce fichier particulier. Si le nom du fichier ne commence pas par un caractère imprimable, vous pouvez limiter les correspondances aux fichiers dont le premier caractère ne fait pas partie d'un ensemble de caractères imprimables:(Faites attention si votre modèle peut correspondre à un fichier appelé
-f
, ce quirm
serait considéré comme une option.)Une autre méthode consiste à appeler
ls -i
pour trouver l'inode du fichier (un inode identifie de manière unique un fichier sur un système de fichiers donné), puisfind -inum
à opérer sur ce fichier particulier. Cette méthode est surtout utile lorsque le répertoire contient beaucoup de fichiers.Si vous
find
n'avez pas d'-delete
option, appelezrm
:(Oui, je sais que la plupart de ces informations ont déjà été publiées. Mais les réponses avec les informations pertinentes compliquent encore les choses.)
la source
Essayez d’utiliser
echo -e
pour obtenir le personnage\177
, puisxargs
pour le transmettre àrm
.s'avère queecho
ne prend pas d'échappements décimaux, convertissez-vous donc en hexadécimal: il177
c'est un octal;echo
nécessite un\0
(littéral, octet non nul) avant:la source
\xb1
est décimal177
, le\0
termine par null et-0
ditxargs
de prendre un nom terminé par un caractère null au lieu d'un nom avec une terminaison de nouvelle ligne.echo
, tel quel , envoie 2 noms de fichier à xargs, puis àrm
... le deuxième nom de fichier est\n
.. Il en résulte une erreur ou la suppression d'un fichier de ce nom ('\ n')-n
pour me débarrasser de la nouvelle ligne.Je peux juste pour vous garantir que le fichier n'avoir un nom. Il se trouve que c’est un nom qui contient des caractères non imprimables.
Si cela
rm
n'a pas fonctionné, utiliser le résultat defind
l'-inum
option avec comme argumentrm
ne devrait pas vous aider. il va juste passer le même argument àrm
, avec le même problème.Le fichier est le seul dans ce répertoire, non?
La première chose que j'essaierais est d'
cd
entrer dans le répertoire, puis de taperrm ./
puis d'appuyer sur la touche Tab. Cela devrait développer l'argument jusqu'au nom réel du fichier et le précédent./
devrait empêcherrm
d'interpréter l'argument comme autre chose qu'un nom de fichier.Une autre solution consiste à
cd
utiliser le répertoire parent, puis à utiliserrm -r
(ou, si nécessairerm -rf
) sur le répertoire. Cela devrait supprimer le répertoire et tout son contenu, quel que soit son nom. Vous pouvez ensuite utilisermkdir
pour recréer le répertoire (et peut-êtrechmod
pour restaurer ses autorisations).MODIFIER :
En regardant à
ls -lb
nouveau votre sortie, je pense que le nom du fichier commence par unDEL
caractère ASCII (ce qui est mauvais, pas fatal) et contient un ou plusieurs caractères de nouvelle ligne (ce qui est vraiment mauvais). Autant que je sache, larm
commande ne peut pas interpréter une nouvelle ligne comme faisant partie d'un nom de fichier.Mais l'
unlink()
appel système peut. Voici un script Perl que j’ai concocté et qui va parcourir les fichiers du répertoire courant et vous demander pour chacun d’eux si vous souhaitez le supprimer. Il n'utilise pas de commande externe commerm
pour supprimer les fichiers. Il devrait donc être capable de gérer tous les caractères amusants pris en charge par le système de fichiers (tout ce qui est autre que ASCIINUL
et/
).Faire
rm -r
ourm -rf
sur le répertoire contenant devrait toujours fonctionner, mais vous pouvez essayer ceci si vous voulez simplement supprimer un seul fichier.(Une autre solution, s'il y a d'autres fichiers dans le répertoire que vous souhaitez conserver, consiste à déplacer tous les autres fichiers dans un répertoire temporaire, puis à supprimer et à recréer le répertoire, puis à déplacer les autres fichiers vers l'arrière.)
(Oh, et quoi que vous ayez fait pour créer ce fichier, essayez de ne pas le refaire!)
la source
Si vous pouvez trouver exactement ce fichier à l'aide de la
find
commande, vous pouvez utiliser le-delete
prédicat. Soyez juste prudent et définissez-delete
un dernier paramètre dans la commande find, sinon cela fera très mal.la source
Tu es proche. Étape par étape, voici comment supprimer le fichier par numéro d'inode.
Tout d’abord, recherchez le numéro d’inode du fichier souhaité à l’aide de
ls -li
. Le numéro d'inode sera dans la première colonne de sortie.Par exemple:
Dans ce cas, le numéro d'inode est 311010
Utilisez
find
pour rechercher le fichier par numéro d'inode.Assurez-vous que
find
ne renvoie que le nom du fichier que vous souhaitez supprimer. Par exemple:Une fois que vous avez
find
trouvé le bon fichier, passez le-delete
paramètre àfind
. Il supprimera le fichier pour vous.la source
Les autres réponses sont excellentes et fonctionneront dans presque tous les environnements.
Mais, si vous avez une interface graphique en cours, ouvrez simplement le répertoire dans Nautilus, Dolphin, Konqueror ou votre gestionnaire de fichiers préféré. Vous devriez pouvoir facilement voir et supprimer tout fichier dont le nom ne coopère pas en quelques clics de souris. .
Si vous n'êtes pas un utilisateur régulier d'emacs ou de vim (comme indiqué dans plusieurs autres réponses), c'est peut-être le moyen le plus simple.
la source
Avait un problème similaire avec un fichier nommé "\ 033" (le caractère réel "Escape").
Ce qui précède vous invite à supprimer des fichiers du répertoire en cours qui ne commencent pas par une lettre ou un chiffre.
la source
Au lieu de cela, vous pouvez renommer le répertoire actuel en
DirX_OLD
, créer un nouveau répertoire avec le nomDirX
et déplacer tous les fichiers requis deDirX_OLD
versDirX
. Après avoir copié les fichiers, vous pouvez supprimerDirX_OLD
la source
Juste au cas où cela aiderait quelqu'un, j'ajouterais mes deux cents. J'ai pu obtenir le (s) nom (s) de fichier en utilisant
stat
le caractère générique comme ceci:Sortie:
Ensuite, je pourrais utiliser les chaînes citées par ANSI C (telles qu'utilisées dans la réponse acceptée) pour accéder aux fichiers:
la source
Chaque fichier a un nom, il vous suffit de trouver exactement lequel.
Je vais utiliser ces fichiers comme exemples:
Ces fichiers montreront comme
?
d'habitudels
:Mais si vous
ls
autorisez l'-Q
option, le nom de fichier réel doit être clairement défini:ce sont les numéros d'inode et les noms "cités" dans la
1
colonne des fichiers de pwd.C'est-à-dire que vous utilisez l'habilité d'un shell (POSIX) pour utiliser des extensions (globbing):
Pour avoir les noms avec n'importe quel caractère non imprimable:
Et pour lister les fichiers qui ne peuvent contenir que des caractères non imprimables:
Ensuite, pour les
-i
supprimer sélectivement ( option (interactive)), utilisez:Il vous suffit de choisir ceux à effacer en répondant
y
à la question ci-dessus.la source
Si vous avez une bash avec la complétion automatique, cela peut fonctionner pour vous. J'ai tapé le caractère qui était montré dans la liste de répertoire. Ensuite, j'ai déclenché la saisie semi-automatique et renommé la chose en quelque chose imprimable.
Voici ce qui a fonctionné pour moi:
la source
a travaillé pour moi.
la source