Supprimer le dossier node_modules de manière récursive à partir d'un chemin spécifié à l'aide de la ligne de commande

92

J'ai plusieurs projets npm enregistrés dans un répertoire local. Maintenant, je veux faire une sauvegarde de mes projets sans le node_modulesdossier, car il prend beaucoup d'espace et peut également être récupéré à tout moment en utilisant npm install.

J'ai donc besoin d'une solution pour supprimer tous les dossiers node_modules de manière récursive à partir d'un chemin spécifié à l'aide de l'interface de ligne de commande. Toute suggestion / aide est très appréciable.

Sumit
la source

Réponses:

225

Imprimez une liste des répertoires à supprimer:

find . -name 'node_modules' -type d -prune

Supprimer les répertoires du répertoire de travail actuel:

find . -name 'node_modules' -type d -prune -exec rm -rf '{}' +

Vous pouvez également utiliser trash ( brew install trash) pour la suppression par étapes:

find . -name node_modules -type d -prune -exec trash {} +
Darius
la source
26
-pruneest une optimisation importante. Il va trouver cas pas récursivité dans les node_modulerépertoires (à la recherche de node_modules imbriquées)
rzymek
1
Pour un projet, je reçois /node_modules/gulp-server-livereload/node_modules: Directory not emptybeaucoup de dossiers node_modules "internes". Comment contourner cela?
josemigallas
15
C'est comme, je suis sérieux, la 20e fois que je suis à cette réponse pour copier ce code ... xD
Cipi
6
Quelle est la signification de '{}' +?
Rokit
3
{}est un espace réservé qui findremplace par le chemin du fichier qu'il a trouvé. +dit findd'ajouter tous les chemins de fichiers à une seule commande plutôt que de s'exécuter rmpour chacun.
Tamlyn
24

Améliorer la réponse acceptée,

find . -name 'node_modules' -type d -prune -exec rm -rf '{}' +

J'ai trouvé que la commande s'exécuterait très longtemps pour récupérer tous les dossiers, puis exécuter une commande de suppression, pour rendre la commande réactivable, je suggérerais d'utiliser \;et pour voir la progression de la commande en cours d'exécution, utilisez -printpour voir le répertoire en cours de suppression.

Remarque: vous devez d'abord cddans le répertoire racine, puis exécuter la commande ou au lieu d' find .utiliserfind {project_directory}

Pour supprimer des dossiers un par un

find . -name 'node_modules' -type d -prune -exec rm -rf '{}' \;

Pour supprimer les dossiers un par un et imprimer le dossier en cours de suppression

find . -name 'node_modules' -type d -prune -print -exec rm -rf '{}' \;

Éditer:

Pour les personnes qui aiment la manière interactive de le faire, reportez-vous à la réponse @jeckep, exécutez-la dans le répertoire que vous souhaitez élaguer.

npx npkill
Sidharth
la source
Belles améliorations sur la réponse acceptée @Sidharth, très appréciées
nclarx
10

J'ai trouvé cette solution,

  • recherchez d'abord le dossier en utilisant findet spécifiez le nom du dossier.
  • exécuter la commande de suppression de manière récursive -exec rm -rf '{}' +

exécutez la commande suivante pour supprimer des dossiers de manière récursive

find /path -type d -name "node_modules" -exec rm -rf '{}' +

Sumit
la source
1

bashfonction à supprimer node_modules. Il supprimera tous les node_modulesrépertoires de manière récursive du répertoire de travail actuel, tout en imprimant les chemins trouvés.

Vous avez juste besoin de mettre quelque part dans votre $PATH

rmnodemodules(){

  find . -name 'node_modules' -type d -prune -exec echo '{}' \; -exec rm -rf {} \; 

}
Ivan V.
la source
0

Cela fonctionne vraiment bien

find . -name "node_modules" -exec rm -rf '{}' +
Ankit Sinha
la source
2
Ceci est un double des réponses précédentes, mais sans explication.
moopet le