Jak usunąć tylko pliki, ale zachować strukturę katalogów?

16

Chciałbym usunąć każdy plik, ale zachowaj strukturę folderów. Czy jest jakiś sposób?

UWAGA: (Używam GNU bash 4.1.5).

Tom Brito
źródło
1
Jak dokładnie masz na myśli „wykluczyć”? Czy używasz jakiegoś polecenia? Jeśli tak, zaktualizuj swoje pytanie, aby to uwzględnić.
slm
Myślę, że masz na myśli usunięcie każdego pliku.
slm
1
@slm Zaktualizowałem poleceniem, którego zwykle używam do wykluczania plików.
Tom Brito
Nie, nie zrobiłeś :-) Lub, jeśli to zrobiłeś, usunąłeś go ponownie
Mawg mówi przywrócić Monikę

Odpowiedzi:

18

Spróbuj tego:

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

Spowoduje to usunięcie każdego pojedynczego pliku, z wyjątkiem katalogów, poniżej bieżącego katalogu roboczego. Bądź bardzo ostrożny z tym poleceniem.

Jeśli wersja findna twoim komputerze to obsługuje, możesz również użyć

find . ! -type d -delete

źródło
@slm: Nie jestem pewien, jak to jest przenośne. Dodałem go jako opcję dodatkową. Właśnie zdałem sobie sprawę, że moja edycja sprawiła, że ​​moja odpowiedź była praktycznie identyczna z twoją. Przepraszam za to; to nie było moim zamiarem.
Czy „{}” chroni przed spacjami w plikach? Widzę, że używasz cały czas i nie sądzę, żebym kiedykolwiek widział, jak się to używa, zanim nie zobaczyłem, jak publikujesz rozwiązania z tym.
slm
Na stronie GNU znajdź stronę podręcznika: „Zauważ, że nawiasy klamrowe są ujęte w znaki pojedynczego cudzysłowu, aby chronić je przed interpretacją jako interpunkcji skryptu powłoki”. Nie jestem jednak pewien, kiedy jest to konieczne. W większości robię to z przyzwyczajenia. findKomenda nie widzi cudzysłowie. Po prostu traktuje {}znacznik jako argument.
Widzę to na przykładzie, ale szablony pokazują to „ -exec command {} +” i to „ -exec command ;”. W \;przeszłości korzystałem z „{}”.
slm
@slm: Szablony również nie pokazują ucieczki średnika, co jest na ogół konieczne, gdy używa się powłoki do wykonania find. Myślę, że szablony mają pokazywać, jakich argumentów findpotrzebuje polecenie i nie martw się o nic związanego z powłoką.
7

Możesz użyć polecenia, findaby zlokalizować każdy plik, ale zachować strukturę katalogów:

$ find /some/dir -type f -exec rm {} +

Na podstawie tego pytania dotyczące Uniksa i Linuksa zatytułowane: gnu znajdź i maskuj {} dla niektórych powłok - które? , ucieczka przed {}pojedynczymi tikami ( ') nie wydaje się już konieczna w przypadku współczesnych powłok, takich jak Bash.

slm
źródło
1

Łatwy sposób na rekursywne usunięcie każdego zwykłego pliku z bieżącego katalogu i podkatalogów:

zsh -c 'rm **/*(.)'

Tylko zsh ma kwalifikatory globowania do dopasowania plików według typu. Jednak rmpolecenie nie działa na katalogach, więc w bash możesz użyć

shopt -s globstar
rm **/*

To nie działa dla poleceń innych niż rmchociaż. Ogólnie możesz użyć find:

find . -type f -delete

lub jeśli twój findnie obsługuje -delete:

find . -type f -exec rm {} +
Gilles „SO- przestań być zły”
źródło
-2

Miałem podobny wymóg usuwania plików ze ścieżki i jej podkatalogów (filtrowanie według czasu) bez usuwania struktury katalogów.

I użyłem poniższego formatu, który działał dla mnie.

find / test123 / home / test_file_hip / data / nfs -mtime +6 -type f -exec rm {} \;

Składnia: find (ścieżka do pliku) -mtime (większy lub mniej niż dni) -typ f -exec rm {} \;

-type: Wspomnij o typie pliku „f” dla katalogu „d” -exec: wykonaj polecenie rm: remove {}: wyjście polecenia find

Uwaga: przetestuj go przed użyciem. Jeśli coś przeoczyłem, możesz je poprawić lub zaktualizować.

Rohit
źródło
1
ponieważ jest to dodatkowy wymóg, o którym nie wspomniał PO, a ponieważ podstawowa find ... rmstruktura została już uwzględniona, nie jestem pewien, czy jest to cenny wkład jako nowa odpowiedź na to pytanie.
Jeff Schaller