6 votes

Le déplacement d'un dossier vers la corbeille dans le Finder n'est pas synchronisé avec le Terminal

J'ai essayé de supprimer un dossier auquel j'accède via terminal.app. Bien que le Finder ait déplacé le dossier vers la Corbeille, j'ai pu en voir le contenu et modifier le fichier depuis le terminal.

  • a créé un fichier texte

created a textfile

  • Déplacer le répertoire entier dans la corbeille via le Finder.

Deleting the entire directory from Finder

  • Je vois des fichiers même après avoir déplacé le dossier dans la corbeille.

I see files even after deleting the folder

  • J'ai quand même réussi à modifier/appliquer du contenu au fichier

I still managed to edit/append content to the file

Le fichier n'est pas disponible dans le menu Récent de Textedit après avoir été déplacé dans la Corbeille, mais peut être visualisé dans le terminal avec cat commandement. Même après avoir été déplacé dans la corbeille, le répertoire PWD ne met pas à jour le chemin (avec le chemin trash/tmp)

Voir le screencast complet (5.20 min / ~24mb)

Existe-t-il un moyen de synchroniser la ligne de commande avec le Finder pour ce scénario ?

9voto

shsteimer Points 8749

En un mot, oui, ce comportement est attendu. C'est loin d'être idéal mais c'est tout à fait explicable et c'est un produit dérivé de la façon dont les fichiers et les répertoires sont représentés au niveau du système de fichiers.

Il permet de comprendre comment les fichiers et les répertoires sont représentés sur le système de fichiers sous-jacent via les inodes. Et comment le déplacement d'un fichier sur le même système de fichiers ne modifie pas réellement les blocs du fichier, il ne fait que déplacer les métadonnées des inodes.

Prenons un peu de recul et assurons-nous de bien comprendre : lorsque vous supprimez un fichier via le Finder, vous ne le supprimez pas réellement (la plupart du temps). Vous le déplacez simplement vers un emplacement de la corbeille qui se trouve sur la même partition logique que le fichier. Le fait que l'emplacement de la corbeille soit sur la même partition est important. Il permet au système d'exploitation d'exploiter les inodes pour rendre la suppression vraiment, vraiment rapide.

Parlons maintenant des inodes. Pour les fichiers ordinaires, les inodes contiennent les métadonnées du fichier ainsi que des pointeurs vers les blocs de données du système de fichiers qui contiennent réellement les données du fichier. Les métadonnées sont des choses comme la date de création, la date du dernier accès, le propriétaire et le groupe, les paramètres de permissions, etc.

Pour les répertoires, l'inode contient toutes ces métadonnées. plus il contient un pointeur vers une liste de tous les inodes qui sont "dans" ce répertoire. Ainsi, si je "déplace" un fichier sur un système de fichiers, je ne fais que prendre une référence à l'inode de ce fichier à partir de la liste de fichiers d'inodes de son répertoire actuel et le déplacer vers la liste de fichiers d'inodes d'un autre répertoire. La liste a changé, mais la référence à l'inode du fichier n'a pas changé.

Ce brassage des métadonnées signifie que l'emplacement physique des blocs de fichiers et l'inode du fichier lui-même ne changent pas réellement sur le disque. Tout programme accédant actuellement au fichier (en supposant que le verrouillage des fichiers n'est pas utilisé) peut continuer à y accéder même si je le déplace, car toutes les références dont il a besoin sont restées les mêmes. L'inode d'un fichier ou d'un répertoire ne change pas tant qu'il est conservé sur le même système de fichiers. Et lorsque les programmes accèdent aux fichiers et aux répertoires, la plupart de ces accès se font via des références d'inode.

Plutôt chouette.

Mais cela peut donner lieu à un comportement déroutant si vous accédez à un répertoire à partir de plusieurs endroits et que vous déplacez ensuite le répertoire. Et c'est ce que vous rencontrez.

Dans votre cas, vous avez une invite de Terminal dans un répertoire. Lorsque vous avez accédé à ce répertoire, votre shell a lu les métadonnées inodes de ce répertoire et a mis à jour certaines structures de données et variables d'environnement. L'une de ces variables d'environnement était la variable PWD.

Ensuite, vous avez supprimé le répertoire, ce qui a placé l'inode de ce répertoire sous l'icône .Trash la liste des fichiers du répertoire. Les métadonnées de ces deux inodes ont été mises à jour de sorte que le répertoire supprimé a maintenant un attribut de métadonnées de répertoire parent qui pointe sur .Trash et le .Trash a obtenu une nouvelle entrée dans sa liste d'enfants : l'inode du dossier supprimé. Mais votre application Terminal ne savait pas que cela s'était produit. Rien ne lui a dit qu'elle devait recharger ses structures de données. C'est pourquoi pwd y $PWD continuent d'afficher le chemin d'accès original au répertoire. Vous devez déclencher une action dans l'interpréteur de commandes qui provoque la relecture des métadonnées d'inode du répertoire de travail et la génération des structures de données et des variables d'environnement. Cela peut être quelque chose d'aussi simple que d'appeler cd . pour effectuer un changement de répertoire sans intervention. Ou vous pouvez sortir et rentrer dans le répertoire avec des chemins absolus.

La raison pour laquelle cat dans le Terminal fonctionne pour vous montrer un fichier dans ce répertoire est que l'inode que cat utilise pour accéder à ce fichier n'a pas changé juste parce que son emplacement sur le disque a changé. Donc cat peut toujours le trouver étant donné que vous utilisez une référence relative au fichier. Si votre fichier se trouvait à l'origine à /foo/bar/moo.txt et vous avez essayé de faire cat /foo/bar/moo.txt après vous avez supprimé le bar via le Finder, vous verrez que le répertoire cat échouerait avec une erreur de type "file-not-found". Mais cat moo.txt continuerait à fonctionner parce que toutes les structures de données du système de fichiers qui cat doit utiliser pour trouver moo.txt dans votre répertoire de travail n'ont techniquement pas assez changé pour que cat à l'invite de votre Terminal pour en perdre la trace.

C'est la longue explication. J'espère que je ne vous ai pas perdu. :)

0voto

Joe Brinkman Points 834

Je crois que c'est un comportement attendu. Bien que PWD ne met pas le chemin à jour tout de suite, si vous faites quelque chose d'autre comme cd .. ou même cd . vous pouvez voir que le chemin est mis à jour.

0voto

nohillside Points 82672

Déplacer quelque chose vers la Corbeille dans le Finder fait exactement cela, il faut juste se déplace le fichier/dossier dans un répertoire spécial (commodément nommé .Trash). Dans Terminal.app, vous travaillez au niveau Unix et pouvez toujours accéder au dossier comme d'habitude. Une fois que vous avez vidé la Corbeille, le dossier disparaît pour de bon.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X