Jakie jest polecenie usunięcia wszystkich plików, ale nie katalogów?

23

Powiedzmy, że mam takie drzewo katalogów:

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2

Gdybym użył rm -r FOLDER/*, wszystko w FOLDERZE zostałoby usunięte, łącznie z podkatalogami. Jak mogę usunąć wszystkie pliki w FOLDERZE i jego podkatalogach bez usuwania rzeczywistych katalogów?

PKM
źródło

Odpowiedzi:

37

Próbujesz usunąć rekurencyjnie. Do tego potrzebujesz narzędzia rekurencyjnego, takiego jak find.

find FOLDER -type f -delete
Sergiy Kolodyazhnyy
źródło
13

Z bash:

shopt -s globstar  ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done

Tutaj iteracja po globalnie rozszerzonych nazwach plików i usuwanie tylko plików.

Powyżej jest na sucho, jeśli jesteś zadowolony ze zmian, które należy wprowadzić, usuń echodo faktycznego usunięcia:

for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done

Wreszcie, rozbrojony globstar:

shopt -u globstar

Dzięki zshwykorzystaniu globalnego kwalifikatora:

echo -- FOLDER/**/*(.)

(.) to kwalifikator glob, który ogranicza rozszerzenia globu do zwykłych plików.

Powyżej wydrukuje tylko nazwy plików, do faktycznego usunięcia:

rm -- FOLDER/**/*(.)
heemayl
źródło
2
+1 dla globowania zsh. Więcej osób powinno zdawać sobie sprawę z niesamowitych rzeczy, które potrafi zsh.
marcelm,
11

Jeśli twoja wersja findnie obsługuje -delete, możesz użyć następujących elementów, aby usunąć każdy plik w bieżącym katalogu i poniżej.

find . ! -type d -exec rm '{}' \;

źródło
-exec rm {} +byłoby szybsze, zwłaszcza jeśli jest dużo plików.
mur
I find . ! -type d -exec rm {} +usuwa sym łącza, jak również.
Sprawiedliwość dla Moniki
1
@muru: Jeśli określona implementacja findnie obsługuje -delete, prawdopodobnie też nie obsługuje -exec ... {} +. Zalecanym sposobem radzenia sobie z tym jest find ... -print0 | xargs -r0 rm(jeśli oczekuje się wielu potencjalnych dopasowań).
David Foerster,
5
@DavidFoerster nie bardzo. -exec ... {} +jest POSIX, ale -deletenie jest. ( -print0
Nawiasem
@muru: Wystarczająco uczciwy. Spotkałem co najmniej dwie findimplementacje inne niż POSIX, które były obsługiwane, -print0ale nie obsługiwane -exec ... {} +( -deletechoć nie pamiętam o tym ). Jeden był na OS X, drugi na Solarisie (kilka lat temu na bardzo konserwatywnie zaktualizowanym systemie). Można również zastąpić -print0z -printf '%p\0'. W każdym razie jest to Ask Ubuntu, a nie Unix i Linux, a Ubuntu używa GNU find od zawsze.
David Foerster,