Lors du déballage d'une archive tar, j'ai rencontré un répertoire qui ls
indique "??????????????? ?????". Vraisemblablement, le nom n'est pas en unicode? Quoi qu'il en soit, je n'arrive pas à trouver un moyen d'accéder au dossier. J'ai essayé cd $(find -inum inode_number)
, mais ça me donne
"bash: cd: ./??????????: No such file or directory".
Existe-t-il un autre moyen d'accéder à un dossier directement par son numéro d'inode?
filenames
inode
directory-listing
jackd243
la source
la source
cd */
pourrait alors fonctionner.*
devrait développer une description compréhensible du répertoire du shell etcd
ignore les arguments supplémentaires. Une autre façon pourrait être d'utiliser un gestionnaire de fichiers graphique (y compris le MC basé sur le terminal) ou les navigateurs d'arborescence de fichiers intégrés, par exemple dans Vim. Vous pouvez également expérimenter le-exec
passage àfind, not with
cd` directement (qui est un shell intégré) mais avec par exemplels
et d'autres outils.cd
plusieurs arguments échouent.too many arguments
".Réponses:
Une approche générale pour pouvoir opérer sur n'importe quel répertoire (ou fichier) est d'utiliser son numéro d'inode.
Tout d'abord, utilisez ls pour obtenir l'inode du dossier en question:
-l
pour une longue liste (facultatif)-i
pour obtenir des valeurs d'inode-a
pour afficher tous les fichiers, même les fichiers cachés (facultatif)Dans la liste, vous verrez un long numéro dans la première colonne, quelque chose comme ceci:
Vous pouvez maintenant passer à ce répertoire en utilisant:
... mais en remplaçant ###### par le numéro long que vous avez obtenu dans la liste du répertoire.
Bien sûr, la commande ne doit pas nécessairement l'être
cd
. Il pourrait êtrerm
,cp
,mv
, etc ...la source
Étant donné que les caractères sont probablement des caractères internationaux, ils apparaissent probablement comme des codes de contrôle dans votre jeu de caractères en_US, c'est pourquoi ls les affiche comme des points d'interrogation.
Cela peut être dû au choix par défaut de votre distribution des alias ls dans le profil global. Par exemple:
Vous pouvez voir si votre distribution l'a fait en tapant dans votre shell:
Qui imprimera quelque chose comme ceci:
La page liée ci-dessous suggère que si vous faites "ls -b", vous verrez les codes de contrôle octaux afin que vous sachiez au moins quels caractères sont utilisés.
http://www.arsc.edu/arsc/support/howtos/nonprintingchars/
En supposant que cela ne fonctionne pas, vous avez également une autre option mentionnée plus près du bas:
Un outil que je ne connaissais pas jusqu'à présent appelé OctalDump (sur Debian - / usr / bin / od)
Vous montrera la forme octale des codes de contrôle.
Vous montrera les personnages, y compris tous les espaces supplémentaires cachés qui pourraient être à la fin (notez les espaces supplémentaires à la fin dans leur exemple)
Une fois que vous savez quels personnages de contrôle sont en jeu et s'il y a des espaces cachés supplémentaires, vous pouvez trouver un moyen de passer au CD dans le répertoire en échappant aux personnages de contrôle. A défaut, vous avez deux options pour renommer le répertoire.
La page ci-dessus a également, de manière pratique, une méthode rapide et sale pour supprimer les caractères de contrôle via la commande mv, qui je pense fonctionnera, tant que vous échappez à l'espace, mais n'échappez PAS aux points d'interrogation (ce qui en fait des caractères uniques caractères génériques), et tant qu'il n'y a rien d'autre dans le répertoire où se trouve ce répertoire escroc. La raison de ces exigences explicites est que vous n'utilisez que des caractères génériques et l'espace unique et que vous ne souhaitez donc pas que le caractère générique corresponde par inadvertance à un autre fichier ou répertoire.
Si la méthode ci-dessus ne fonctionne pas, vous pouvez presque certainement utiliser la méthode de recherche mentionnée par d'autres réponses, d'une manière différente. Plutôt que d'essayer de cd dans le répertoire en utilisant le numéro d'inode, ce que vous avez dit avoir essayé, vous pouvez le renommer en utilisant le numéro d'inode. Assurez-vous simplement de copier l'ensemble complet de 3 lignes pour cette commande à partir de la page ci-dessus (remplacez la partie "nom-désiré" par le nom réel que vous voulez renommer cependant).
Une fois le répertoire renommé, vous devriez pouvoir y accéder. Je peux seulement espérer qu'il ne contient pas également de fichiers avec des codes de contrôle dans les noms, ou vous devrez rincer et répéter pour chaque fichier (et / ou sous-répertoire) dans le répertoire que vous venez de renommer, auquel cas une boucle for serait il serait probablement judicieux de simplement nommer chaque fichier en nombre, en incrémentant à partir de 1. :-)
la source
"?" a une signification particulière dans le shell, cela signifie "n'importe quel caractère, y compris aucun". Donc, si votre fichier est vraiment nommé "??????????????? ?????" vous devez probablement échapper au "?" (et espace les toos) pour essayer quelque chose comme cd \? \? \? \? \? \? \ \? \? \? \? (si vous n'avez pas déjà essayé)
Cela suppose que quelqu'un a intentionnellement donné au fichier ce nom délicat, plutôt qu'un codage tronqué / corrompu / illégal.
la source
ls
aime afficher les caractères non ASCII (≥0x7F) sous la forme?
–– afin que le nom du répertoire ne soit probablement pas qu'une chaîne de points d'interrogation.Faites un
ls
. Y a-t-il quelque chose dans le répertoire (fichier ou sous-répertoire) avec un nom plus long que votre sous-répertoire mystère (qui est 21, si votre «??????????????? ?????» est précis)? Renommez-les ensuite en noms plus courts ou déplacez-les dans d'autres répertoires. Tapez ensuiteCe caractère générique (20 points d'interrogation suivis d'un astérisque) doit correspondre à n'importe quel nom de 20 caractères ou plus - et la première instruction que j'ai donnée aurait dû garantir que votre sous-répertoire mystère est la seule chose qui correspond à ce modèle. Mais il pourrait être plus utile de le faire
la source
ls
avec l' une ou l' autre--quoting-style=shell
ou l'--quoting-style=escape
option pour le forcer à produire une version correctement échappé de ce nom de fichier.Un moyen simple de voir ce qu'il y a est de FTP vers la machine avec FileZilla. Ensuite, vous pouvez utiliser FileZilla pour renommer le répertoire.
la source
Utilisez un navigateur de fichiers tel que Midnight Commander (texte), Nautilus (GNOME) ou Dolphin (KDE) pour travailler avec le répertoire.
la source
pour travailler avec des répertoires (ou fichiers) qui ont des noms étranges / difficiles à taper:
1) Exécutez
ls -i
pour découvrir l'inode du fichier.Cette
ls
option vous donnera chaque nom de fichier, et un identifiant pour ce fichier sur le système de fichiers (l'inode)2) Utilisez find pour exécuter une commande sur le fichier
dire que l'inode était 9961926
tu pourrais courir
supprimer le fichier
ou
pour le déplacer vers un meilleur nom
ou même
lui donner un nouveau nom tout en gardant l'ancien nom
(sans doute, vous pouvez également exécuter d'autres commandes. Malheureusement, je ne pouvais pas utiliser cette ligne pour exécuter a
cd
)la source