Usuń cyklicznie folder node_modules z określonej ścieżki za pomocą wiersza poleceń

92

Mam wiele projektów npm zapisanych w katalogu lokalnym. Teraz chcę wykonać kopię zapasową moich projektów bez node_modulesfolderu, ponieważ zajmuje on dużo miejsca i można go również odzyskać w dowolnym momencie za pomocą npm install.

Tak więc potrzebuję rozwiązania, aby usunąć wszystkie foldery node_modules rekurencyjnie z określonej ścieżki za pomocą interfejsu wiersza poleceń. Wszelkie sugestie / pomoc są bardzo odczuwalne.

Sumit
źródło

Odpowiedzi:

224

Wydrukuj listę katalogów do usunięcia:

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

Usuń katalogi z bieżącego katalogu roboczego:

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

Alternatywnie możesz użyć trash ( brew install trash) do usuwania etapowego:

find . -name node_modules -type d -prune -exec trash {} +
Darius
źródło
26
-pruneto ważna optymalizacja. W przypadku stwierdzenia, że ​​nie będzie powtarzać się w node_modulekatalogach (szukać zagnieżdżonych modułów node_modules)
rzymek
1
W przypadku projektu otrzymuję /node_modules/gulp-server-livereload/node_modules: Directory not emptywiele „wewnętrznych” folderów node_modules. Jak to obejść?
josemigallas
15
To tak, jak mówię poważnie, 20. raz jestem przy tej odpowiedzi, aby skopiować ten kod ... xD
Cipi
6
Jakie to ma znaczenie '{}' +?
Rokit
3
{}jest symbolem zastępczym, który findzastępuje znalezioną ścieżkę do pliku. +mówi, findaby dołączyć wszystkie ścieżki plików do pojedynczego polecenia, zamiast uruchamiać je rmdla każdego.
Tamlyn
24

Poprawa zaakceptowanej odpowiedzi,

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

Zauważyłem, że polecenie działałoby bardzo długo, aby pobrać wszystkie foldery, a następnie uruchomić polecenie usuwania, aby polecenie można było wznowić, sugerowałbym użycie \;i sprawdzenie postępu wykonywanego polecenia, -printaby zobaczyć usuwany katalog.

Uwaga: Najpierw musisz przejść cddo katalogu głównego, a następnie uruchomić polecenie lub zamiast find .używaćfind {project_directory}

Aby usunąć foldery jeden po drugim

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

Usuwanie folderów jeden po drugim i drukowanie usuwanego folderu

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

Edytować:

Dla osób, które lubią interaktywny sposób, zapoznaj się z odpowiedzią @jeckep, uruchom ją w katalogu, który chcesz przyciąć.

npx npkill
Sidharth
źródło
Niezłe ulepszenia w zaakceptowanej odpowiedzi @Sidharth, bardzo cenne
nclarx
10

Natknąłem się na takie rozwiązanie,

  • najpierw znajdź folder za pomocą findi określ nazwę folderu.
  • wykonaj rekurencyjnie polecenie usuwania -exec rm -rf '{}' +

uruchom następujące polecenie, aby usunąć foldery rekurencyjnie

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

Sumit
źródło
1

bashfunkcja do usunięcia node_modules. Spowoduje to node_modulesrekurencyjne usunięcie wszystkich katalogów z bieżącego katalogu roboczego podczas drukowania znalezionych ścieżek.

Musisz tylko umieścić gdzieś w swoim $PATH

rmnodemodules(){

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

}
Ivan V.
źródło
0

To działa naprawdę dobrze

find . -name "node_modules" -exec rm -rf '{}' +
Ankit Sinha
źródło
2
To jest duplikat poprzednich odpowiedzi, tylko bez wyjaśnienia.
moopet