Usuń wszystkie pliki rekurencyjnie bez usuwania katalogów

10

Chcę „wyczyścić” wszystkie pliki z katalogu, w tym wszystkie pliki w podkatalogach, ale chcę pozostawić podkatalogi na swoim miejscu. Rozumiem rm -r, że spowoduje to również usunięcie samych podkatalogów.

I nie chcą usuwać ukryte pliki (kropka).

Jak można to zrobić?

Scott Wilton
źródło
1
find -type f ! -name "[.]*" -deletenie jest odpowiedni?
Costas
Nie wiem Czy to robi to, o co proszę?
Scott Wilton,
Spróbuj bez -delete- wystarczy wydrukować nazwy plików, aby je usunąć.
Costas
Czy chcesz usunąć pliki (ukryte lub nie) z ukrytych katalogów?
Stéphane Chazelas
Co z dowiązaniami symbolicznymi do katalogów?
Stéphane Chazelas

Odpowiedzi:

10

Użyj finddo tego:

find . ! -name '.*' ! -type d -exec rm -- {} +
jimmij
źródło
1
Nie wszystkie znalezione implementacje mają-delete
wurtel 30.01.2015
3
@RomeoNinov proszę przeczytać pytanie OP:I do not want to delete hidden (dot) files.
jimmij 30.01.2015
1
@Casas, nie, nie ma powłoki wymagającej ucieczki +(przynajmniej nie w rodzinach Bourne, csh lub rc). Istnieje legenda, która mówi, że niektóre stare wersje cshwymagały ucieczki, {}ale nigdy ich nie spotkałem.
Stéphane Chazelas,
1
@ScottWilton Ukryte katalogi są uwzględnione, ale ukryte pliki w ukrytych katalogach nie. Jeśli chcesz odrzucić wszystkie pliki w ukrytych katalogach, find . ! -name '.*' ! -type d ! -path '*/.*'wykonaj tę pracę.
jimmij
1
@ Jimmy, bardziej lubię find . -name '.?*' -prune -o ! -type d -exec rm {} +unikać zejścia w tych. Pamiętaj, że --nie jest to konieczne (choć nie szkodzi), ponieważ ścieżki zaczynają się od ./.
Stéphane Chazelas
0

spróbuj czegoś takiego:

find <path> ! -name '.*' -type f -exec rm {} \;
Romeo Ninov
źródło
Czy jest jakiś powód, dla którego należy usuwać pliki pojedynczo zamiast przyspieszać .... -exec rm {} + ?
Anthon
Wolę robić rzeczy po kolei. Operacje masowe (i równoległe) mają dziwne (i nieprzyjemne) skutki uboczne (ponieważ powodują ogromne obciążenie podsystemu we / wy)
Romeo Ninov
1
-exec rm {} +nie jest równoległy, po prostu wywołuje rmz kilkoma nazwami plików. Uruchamia mniej rmwywołań, więc jest bardziej przyjazny dla zasobów. Jeśli jest nieco mniej bezpieczny, ponieważ powiększa okno wyścigu, w którym składnik katalogu plików do usunięcia można zmienić na dowiązanie symboliczne. Ale tylko -deletelub w -execdir rm {} \;pełni by to rozwiązało.
Stéphane Chazelas
@ StéphaneChazelas, żadne z nich (-delete lub -execdir) istnieje w systemie UNIX. I nie widzę w pytaniu, aby wspomnieć o Linuksie!
Romeo Ninov
@RomeoNinov, tak, powiedziałem w innym komentarzu tutaj, że tylko -execstandard. -deletei -execdirpochodzą z BSD, GNU dodało je około 10 lat później. W każdym razie nie ma to nic wspólnego z Linuksem, który jest tylko jądrem.
Stéphane Chazelas