Est-ce que rm -rf *
supprimer tous les fichiers / dossiers dans le répertoire courant? Je veux m'assurer que le caractère générique *
ne montera pas dans les répertoires supérieurs et effacera tout mon système de fichiers. :RÉ
Je me souviens faire chmod 777 .* -R
à des chmod
fichiers cachés et chmod
ed tout mon système de fichiers. Évidemment, j'étais sur le compte root.
rm -rf ./*
et spécifierais explicitement le répertoire courant ... mais Ankur semble dire que cela n'a pas d'importance de toute façon.Réponses:
Non, si vous n'avez pas beaucoup modifié votre shell, cela ne supprimera pas les fichiers ou répertoires commençant par a
.
. Pour les supprimer également, vous pouvez soit les répertorier explicitementou utilisez les bons motifs globaux (merci Chris)
EDIT Le point ici est que vous ne pouvez pas utiliser
.*
pour faire correspondre des fichiers comme.file
, car.*
ou.*?
correspondra également à..
ou.
..[^.]*
correspond à des fichiers comme.file
, tandis que..?*
correspond à des fichiers comme..foo
(*
correspond à zéro ou plusieurs caractères et?
correspond exactement à un).la source
..?*
pour intercepter les entrées qui commencent par «..» (par exemple..foo
).rm
. donc, supprimer le contenu d'un répertoire avec * n'est pas le moyen le plus sage, à mon humble avis.xargs
dépasse un peu la portée de cette question. On pourrait par exemple commencer à y penser lorsque le shell se plaint de la longueur des listes d'arguments.Si vous souhaitez supprimer un répertoire et tout son contenu, vous pouvez
chdir
accéder au répertoire parent et àrm -rf
ce répertoire par son nom, en contournant toute la question de globalisation. Si vous souhaitez supprimer le contenu mais conserver le répertoire, il est plus simple de tout supprimer puis de recréer le répertoire.Il est complexe de trouver un glob qui correspondra à toutes les entrées de répertoire possibles enregistrées. et ..; il est facile de trouver une réponse simple (par exemple,
* .??*
) qui fonctionnera presque toujours dans la pratique. C'est OK pour une utilisation interactive, car il est facile à retenir et les moments où cela ne fonctionne pas peuvent être capturés avec un post-rmls -a
. Pour un script, il est plus facile de supprimer tout et de recréer le répertoire vide.la source
Puisque je pense que cette question concerne davantage ce que * fait (et non rm), essayons une autre approche.
Si vous n'êtes pas sûr de ce que fait le *, vous pouvez d'abord "tester" en utilisant une commande inoffensive comme echo. Avant d'exécuter cela, essayez de deviner ce qu'ils afficheront si vous les exécutez dans votre répertoire personnel.
Mais d'abord, créons un terrain de jeu afin que nous puissions jouer avec les étoiles et voir avec quoi nous nous retrouvons.
Maintenant, dans ce dir, nous avons ceci:
Notez maintenant ce que le * développe en utilisant la commande echo:
Voyons donc ce qui se passe avec la commande rm
Comme vous le voyez, il n'a supprimé que le fichier2, car * ne s'est étendu qu'au fichier2. Si vous tapez rm -rf. *, Ce serait la même chose que d'écrire
Et pour être honnête, ça n'a pas l'air sympa;)
J'espère que cela clarifie la partie * de votre question.
Mise à jour: Cependant, comme le souligne Ankur Goel, il existe une sorte de protection intégrée à rm (un peu inhabituel pour les commandes shell :)
Créons un nouveau terrain de jeu:
Alors maintenant, nous avons à nouveau cela, mais avec test1 appartenant à root comme protection si rm commence à devenir fou.
Supprimons donc tout:
Et il semble que rm n'ait pas été supprimé. et .. même si on le lui avait dit !!!
Donc, après cette longue réponse, il s'avère sûr de tout supprimer dans un répertoire avec ceci:
Mais je l'utiliserais avec précaution, car je ne suis pas sûr que toutes les implémentations de rm se comportent comme ça!
la source
Oui. rm -rf supprimera uniquement les fichiers et dossiers du répertoire en cours et ne remontera pas dans l'arborescence des fichiers. rm ne suivra pas non plus les liens symboliques et ne supprimera pas les fichiers vers lesquels ils pointent, vous ne supprimez donc pas accidentellement d'autres parties de votre système de fichiers.
la source
Si vous ne voulez pas monter d'un niveau comme le dit mpez0 et
rm -rf
ce dossier spécifique, il existe un moyen de travailler sur tous les répertoires / fichiers sauf.
et..
dans le dossier actuel en faisant:Bien sûr, si l'un des répertoires / fichiers contient l'un des caractères de la
IFS
variable spéciale du shell (par exemple, espace, tabulation, nouvelle ligne), vous pouvez d'abord changer l'IFS, exécuter la commande, puis restaurer l'IFS.la source
Un moyen beaucoup plus simple de vider un dossier entier, en évitant également les problèmes de «trop d'arguments» abordés dans cette réponse , consiste simplement à supprimer et à recréer le répertoire lui-même. Pour vous assurer que cela fonctionne correctement lorsque vous êtes dans un répertoire de liens symboliques, utilisez les lignes suivantes:
(Si vous utilisez à la
yourdir
place de$(readlink -f yourdir)
vous ne remplaceriez le lien que lorsque l'emplacement d'origine reste plein)la source
xargs
...