bash - usuwa wszystkie katalogi (i zawartość), ale nie pliki z pwd

19

Chciałbym usunąć wszystkie katalogi z pwd, ale zostawić pliki w pwd w spokoju. Jeśli zawartość mojego pwd to:

mydir1
mydir2
myfile1
myfile2

wtedy chciałbym zostać

myfile1
myfile2

Zakładam, że muszę użyć rm -r -i

Mam rację?

atomh33ls
źródło

Odpowiedzi:

10

Nie, to dałoby ci „brakujący operand”, ponieważ niczego nie określiłeś. Wprowadzenie znaku *zachęci również do plików.

Spróbuję:

find -mindepth 1 -maxdepth 1 -type d -exec rm -r {} \;

mindepth 1Wykluczy .od wyników, maxdepth 1wykluczy próbuje zrobić pod katalogów, które i tak zostaną usunięte (dlatego tworząc ostrzeżenie). Ale w praktyce możesz je pominąć, jeśli zgodzisz się na kilka „niewinnych” ostrzeżeń.

fede.evol
źródło
21

Znalazłem to gdzieś:

rm -r */

Wydaje się najłatwiejszym sposobem. Na przykład musisz potwierdzić każdy przypadek, jeśli masz 5 plików, jest to w porządku, ale przy większych strukturach plików tryb interaktywny nie jest dobrym rozwiązaniem ... Sugerujemy, jeśli jest to ważna informacja, zrób utworzyć kopię zapasową...

Jaskółka oknówka
źródło
1
Będzie to również oznaczać linki symboliczne, co prawdopodobnie nie jest tutaj pożądane.
JdeBP
8

Posługiwać się

rm -rf ./*/

To pozwala uniknąć trybu interaktywnego i usuwa tylko katalogi z lokalnego katalogu.

Widzimy
źródło
Jak JdeBP wskazał na bardzo podobną odpowiedź Martina , jeśli bieżący (najwyższy poziom) katalog zawiera dowiązania symboliczne do innych katalogów, zostaną one również usunięte (nawet jeśli nie znajdują się w bieżącym katalogu lub nie są nim podrzędne).
Scott
3

Coś takiego powinno działać:

find /path -type d -exec rm -rf '{}' \;

-type d szuka tylko katalogów

Matthew Williams
źródło
-1
you can also try in this way to delete only all folders not files from any location in linux.

    #delete only all dir and don't touch files
    #!/bin/bash
    for dir in `ls -l | grep ^d | awk '{print $9}'`
    do
    echo "going to delete $dir " `rm -rf $dir`
    done
    ls
linux.cnf
źródło