web-dev-qa-db-fra.com

Commande pour supprimer tous les fichiers des dossiers correspondant au nom récursivement?

J'ai mon dossier de base (appelons-le base).

J'ai un tas de dossiers à l'intérieur, dispersés à différentes profondeurs dans ces dossiers sont des dossiers de cache.

Je souhaite supprimer tous les fichiers des dossiers de cache, mais pas les dossiers eux-mêmes.

J'ai essayé

cd base
#then one of...
Sudo rm -rf cache/*
Sudo rm -rf *cache/*
Sudo rm -rf cache*/*
Sudo rm -rf *cache*/*

Mais je ne fais que deviner, quelle serait la bonne commande?

4
Hailwood

Dans bash, vous pouvez activer globstar et utiliser ** pour faire correspondre les répertoires de manière récursive.

shopt -s globstar
echo rm -rf ./**/*cache*/*

Voir Pattern Matching

8
geirha

Ceci supprimera récursivement tous les fichiers des dossiers nommés cache, en commençant par le dossier base. Les dossiers cache seront eux-mêmes intacts, mais tous les fichiers qu'ils contiennent seront supprimés.

find base -ipath "*/cache/*" -type f -delete
3
Flint

Vous pouvez utiliser la puissante commande de recherche extrêmement.

Je voudrais utiliser quelque chose comme ça:

find . -iname *cache* -ok rm -rf {} \;

Maintenant, laissez-moi vous l'expliquer. Find est le nom de l'application, elle propose de nombreuses options, mais pour vous, vous n'en aurez pas besoin beaucoup.

Le . signifie regarder dans ce répertoire courant. Cela signifie que vous devez être dans le bon répertoire pour commencer. Je suppose que pour vous c'est ~

-iname signifie rechercher dans mon nom ne respectant pas la casse.

*cache* signifie que le nom doit contenir le cache.

Maintenant, la partie suivante est importante.

-ok signifie exécuter les commandes qui suivent, mais comme moi si je veux le faire en premier. Ceci peut être remplacé par -exec mais je ne le conseillerais pas. Cela effacerait des choses sans vous le dire et vous ne le voulez pas.

Ok, donc la ligne suivante (qui contient tout ce que -ok exécute) est rm -rf {} \;

Le rm -rf J'espère est explicite. Le {} est essentiellement un espace réservé pour le nom du fichier trouvé. Le \; à la fin signifie simplement que c'est la fin de cette ligne.

J'espère que cela à du sens.

Je conseille d'exécuter la commande find sans que tout soit correct, y compris -ok. Il va commencer par afficher une liste de tous les fichiers de cache et vous pouvez les consulter. Ajoutez ensuite la section -ok et commencez à craquer!

1
SuperMatt

Il suffit de remplacer basedir par le chemin du répertoire de base que vous souhaitez supprimer

$ find basedir -type f -delete

Si vous vous sentez plus à l'aise avant de vous rendre dans votre répertoire de base, alors:

$ cd basedir
$ find . -type f -delete
1
jap1968