Accédez au répertoire avec un nom inconnu

8

Lors du déballage d'une archive tar, j'ai rencontré un répertoire qui lsindique "??????????????? ?????". 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?

jackd243
la source
Est-ce peut-être lexicalement premier dans la liste des répertoires? Cela cd */pourrait alors fonctionner. *devrait développer une description compréhensible du répertoire du shell et cdignore 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 -execpassage à find, not with cd` directement (qui est un shell intégré) mais avec par exemple lset d'autres outils.
Daniel Andersson
@Daniel: Dans certains shells, cdplusieurs arguments échouent.
Scott
@Scott: Vrai. POSIX ne spécifie pas le comportement de plusieurs arguments. Bash et Dash ignorent les arguments supplémentaires, csh se termine par " too many arguments".
Daniel Andersson

Réponses:

3

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:

ls -lia
  • -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:

2104697 drwx------ 2 user group 4096 date time WEIRD_DIRNAME

Vous pouvez maintenant passer à ce répertoire en utilisant:

cd "$(find -inum ######)"

... 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 être rm, cp, mv, etc ...

Tyilo
la source
2

É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:

alias ls='ls -q'

Vous pouvez voir si votre distribution l'a fait en tapant dans votre shell:

alias ls

Qui imprimera quelque chose comme ceci:

$ alias ls
alias ls='ls --color=auto'

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)

$ ls | od -b

Vous montrera la forme octale des codes de contrôle.

$ ls | od -c

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. :-)

Speeddymon
la source
0

"?" 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.

Valrian
la source
1
Mais rappelez-vous que lsaime 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.
Scott
0

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 ensuite

cd ????????????????????*

Ce 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

mv ????????????????????* nouveau nom

Scott
la source
3
Il pourrait être utile de fonctionner lsavec l' une ou l' autre --quoting-style=shellou l' --quoting-style=escapeoption pour le forcer à produire une version correctement échappé de ce nom de fichier.
Dan D.
1
@DanD. +1 pour une option intéressante que je ne connaissais pas. J'utilise généralement un gestionnaire de fichiers gui lorsque quelque chose comme cela doit être traité, mais cela peut être utile si je dois travailler à partir d'une console ou d'un script.
Joe
0

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.

kmort
la source
0

Utilisez un navigateur de fichiers tel que Midnight Commander (texte), Nautilus (GNOME) ou Dolphin (KDE) pour travailler avec le répertoire.

Michael Hampton
la source
0

pour travailler avec des répertoires (ou fichiers) qui ont des noms étranges / difficiles à taper:

1) Exécutez ls -ipour découvrir l'inode du fichier.

Cette lsoption 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

 find * -prune -inum 9961926 -exec rm -i {} \;

supprimer le fichier

ou

 find * -prune -inum 9961926 -exec mv {} other-name \;

pour le déplacer vers un meilleur nom

ou même

 find * -prune -inum 9961926 -exec ln -s {} non-horrible-name \;

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)

josinalvo
la source