Je m'interroge sur la direction de la récursivité en général et rm en particulier.
rm récursion ne fonctionne que vers le bas correct?
En cours d'exécution: sudo rm -R *.QTFS
supprimera tous les fichiers * .QTFS du répertoire actuel et ses enfants, correct?
le répertoire actuel affiché par ls -lha
contient également .
et des ..
liens pour l'absence d'un meilleur mot, alors pourquoi la récursivité ne suit-elle pas ces liens vers le haut dans l'arborescence des répertoires? Y a-t-il une limite artificielle à l'application rm, ou .
et ce ..
ne sont pas des choses réelles?
Réponses:
rm -r x y
supprimerax
ety
et tout ce qui s'y trouve (s'il s'agit de répertoires), mais pas leurs parents ou quoi que ce soit en dehors d'eux.Non. Il supprimera tous les fichiers nommés
*.QTFS
, tous les fichiers récursivement dans les répertoires appelés*.QTFS
et ces répertoires eux-mêmes. Si vous souhaitez cet autre comportement de suppression, utilisezfind -delete
.C'est une limite artificielle de
rm
.Ce n'est pas vraiment artificiel, c'est la seule façon dont cela pourrait fonctionner. Si
rm
les..
liens parents étaient suivis , chacunrm -r
supprimerait tous les fichiers du système, en suivant tous les..
liens jusqu'au bout/
.rm
voit les entrées..
et.
dans chaque répertoire lorsqu'il répertorie le contenu et les ignore explicitement pour cette raison.Vous pouvez l'essayer vous-même, en fait. Exécutez
rm -r .
et la plupart desrm
implémentations refuseront d'agir, signalant explicitement une erreur:(ce message vient de GNU
rm
; d'autres sont similaires). Lorsqu'il rencontre ces entrées implicitement, plutôt que comme arguments explicites, il les ignore simplement et continue. Ce comportement est requis par POSIX . Dans GNUrm
et dans de nombreux BSD, il est fourni automatiquement par lafts_read
famille de fonctions de traversée de hiérarchie..
et..
sont généralement de véritables entrées de répertoire, bien que cela soit spécifique au système de fichiers. Ils seront presque toujours présentés comme s'ils étaient de véritables entrées pour tout le code utilisateur, indépendamment. De nombreux logiciels (et pas seulementrm
) mettent en évidence leur comportement afin d'attraper ou d'empêcher une récursion incontrôlée ou indésirable.la source
fts_read
implémentation, cependant, celui-ci est juste pour les arguments de ligne de commande.rm
ne voit même pas,*.QTFS
car il est étendu dans les noms de fichiers par bash avant que le binaire rm soit appelé. La réponse de @ tobyink le note..
et..
les cas particuliers seraient à l'origine de l'existence desEn plus de ce que Michael Homer a écrit, il y a un autre facteur qui rend difficile la récurrence accidentelle dans le répertoire parent.
Allez dans votre répertoire personnel et tapez quelque chose comme:
Vous verrez qu'il affiche une liste de fichiers et de répertoires contenant la lettre "s". Cependant, aucun fichier commençant par un point de tête n'est affiché. Pour les montrer, vous pouvez utiliser:
En effet, le shell refuse de s'étendre
*
pour englober un point de tête. Cela signifie que:Ne rentre pas
..
.la source