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?

Odpowiedzi:


37

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

find FOLDER -type f -delete

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/**/*(.)

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 '{}' \;

-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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.