Existe-t-il une commande permettant de supprimer tous les fichiers et sous-répertoires d'un répertoire SANS supprimer le répertoire?
Par exemple, si j'ai le répertoire "dontDeleteMe" avec les sous-répertoires "1", "2", "3" et que chaque sous-répertoire contient quelques images, comment puis-je supprimer les sous-répertoires "1", "2" et "3" et tous les fichiers qu'ils contiennent, sans supprimer le répertoire parent "dontDeleteMe"?
Pour tout supprimer dans un répertoire sans le supprimer, tapez:
rm -rfv dontDeleteMe/*
Veuillez noter que la partie /*
est très importante. Si vous mettez un espace avant le *
, tous vos fichiers de votre répertoire actuel seront supprimés.
Faites également très attention en jouant avec rm
, -r
et *
dans la même commande. Ils peuvent être une combinaison désastreuse.
Mise à jour: OK, je me suis rendu compte que si vous avez des fichiers cachés/points [noms de fichiers avec des points au début, par exemple, x.x. .hidden
] alors cela laissera ces fichiers intacts.
La solution la plus simple à la question initiale est donc: rm -rfv dontDeleteMe && mkdir dontDeleteMe
Une autre solution consisterait à utiliser l'option -exec
de find
ou de la transmettre à xargs
(ci-dessous):
find dontDeleteMe/* -print0 | xargs -0 rm -rv
La seule raison pour laquelle rm -r ./*
ne fonctionne pas toujours est qu’il est possible que des fichiers et/ou des dossiers cachés ne correspondent pas à *
.
À cette fin, bash
fournit une option permettant de faire correspondre *
à tout, même aux objets cachés:
cd dont-delete-me
shopt -s dotglob
rm -r ./*
Il peut être utile de réinitialiser dotglob
à son état par défaut (non défini), si vous continuez à utiliser le shell où vous avez exécuté les commandes ci-dessus:
shopt -u dotglob
Terminal ouvert (Ctrl+Alt+T) tapez ce qui suit:
find somedir -mindepth 1 -delete
Cela correspondra à tous les fichiers et répertoires de somedir
et de ses (grands) enfants, y compris les fichiers de points "cachés" mais à l'exclusion de somedir
lui-même à cause de -mindepth 1
, puis de -delete
.
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;
Utilisez l'option xdev
pour supprimer les fichiers uniquement dans les limites du périphérique.
Pour supprimer (dans le terminal) tous les fichiers et sous-répertoires à l'exception du répertoire de base nommé "dontdelete":
rm -rf dontdelete/*
Vous pouvez utiliser find
avec l'indicateur -delete
:
find dontDeleteMe/* -delete
Le /*
est important car il indique à find
de rechercher uniquement DANS le dossier appelé "dontDeleteMe".
Assurez-vous également que l'indicateur -delete
figure à la fin de la commande find
.
rm -rf directory/{.*,/*}
Ce qui dit:
Supprimer tous les fichiers en commençant par. dans "répertoire" et tous les autres fichiers aussi.
Bien que comme gentiment noté par Neftas cette solution n'est pas sans danger!
La solution plus sûre est:
rm -rf directory/!(.|..)
Il y a une réponse encore plus simple:
cd dontDeleteMe
rm -rf *
Durée de la lecture de l’administration système de base: Assurez-vous de faire attention à votre position lorsque vous utilisez des commandes rapides comme celle-ci.
Je ne peux pas dire ça assez. J'ai dû récupérer une boîte parce que quelqu'un ne faisait pas attention et a saisi rm -rf *
pendant que je suis dans /.
* nix suppose que si vous êtes root ou si vous êtes Sudo-ing en tant que root, vous savez ce que vous faites. Assurez-vous donc de savoir ce que vous faites avant de le faire.
Une autre solution permettant de s’assurer que votre commande "cd" fonctionne avant de lancer le "rm" consiste à utiliser
cd dontDeleteMe && rm -rf *
Je ne sais pas pourquoi c'est si complexe, aidez-moi si je me trompe
cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf
C'est tout
rm -rf ${PWD}/*
effacera le répertoire de travail actuel