Jak usunąć wszystkie pliki z katalogu?

289

Jestem najbliżej

# rm /path/to/directory/*.*

ale to nie działa w przypadku plików, które nie mają rozszerzenia ...

użytkownik784637
źródło

Odpowiedzi:

340

Linux nie używa rozszerzeń. Twórca pliku decyduje, czy chce, aby nazwa miała rozszerzenie. Linux patrzy na pierwszy bajt, aby dowiedzieć się, z jakim plikiem ma do czynienia.

Aby usunąć wszystko z katalogu, użyj:

rm /path/to/directory/*

Możesz użyć tej -ropcji, na przykład:

rm -r /path/to/directory/*

aby usunąć również wszystkie podkatalogi (wraz z całą ich zawartością) w katalogu, z którego usuwana jest zawartość. W przeciwnym razie pojawi się błąd informujący, że nie usuwa katalogu.

Rinzwind
źródło
13
Jeśli chcesz również usunąć ukryte pliki, uruchom shopt -s dotglobprzed uruchomieniemrm (...)
danjjl,
7
* Oznacza all files;) *.*oznacza wszystkie pliki zawierające .gdzieś w nazwie
Rinzwind
10
@Rinzwind, a dokładniej gwiazdka oznacza „zero lub więcej dowolnych znaków”. Więc *a*oznacza zero lub więcej znaków, po których anastępuje zero lub więcej znaków. To pasuje do nazwy plików happy, apple, alub la.
DisgruntledGoat
7
@ user784637 jesteś zbyt pod wrażeniem
barlop
1
Oto polecenie, które chcesz: rm - *
anon58192932,
168
  • Aby usunąć folder z całą zawartością (w tym wszystkie foldery wewnętrzne ):

    rm -rf /path/to/directory
    
  • Aby usunąć całą zawartość folderu (w tym wszystkie foldery wewnętrzne ), ale nie sam folder:

    rm -rf /path/to/directory/*
    

    lub

    rm -rf /path/to/directory/{*,.*}
    

    jeśli chcesz mieć pewność, że ukryte pliki / katalogi również zostaną usunięte.

  • Aby usunąć wszystkie „pliki” z folderu ( nie usuwając folderów wewnętrznych ):

    rm -f /path/to/directory/{*,.*}
    


  • Ostrzeżenie : jeśli masz spacje na swojej ścieżce, zawsze używaj cudzysłowów.

    rm -rf /path/to the/directory/*
    

    odpowiada 2 oddzielnym rm -rfpołączeniom:

    rm -rf /path/to
    rm -rf the/directory/*
    

    Aby uniknąć tego problemu, możesz użyć 'cudzysłowów '( nie rozwija zmiennych powłoki) lub "podwójnych cudzysłowów "( rozwija zmienne powłoki):

    rm -rf "/path/to the/directory/"*
    


Gdzie:

  • rm- oznacza „ usuń
  • -f- oznacza „ siłę ”, która jest pomocna, gdy nie chcesz być pytany / pytany, czy chcesz na przykład usunąć archiwum.
  • -r- oznacza „ rekurencyjny ”, co oznacza, że ​​chcesz zejść rekurencyjnie do każdego folderu i usunąć wszystko.
Lilian A. Moraru
źródło
8
Uznałem, że jest to bardziej wyczerpująca i pomocna odpowiedź, ponad odpowiedź oznaczoną jako Zaakceptowana.
inspirednz
2
rm -rf /path/to/directory/*nie usuwa ukrytego pliku w folderze np .htaccess. Może rm -rf /path/to/directory/.? Nie próbowałem tego.
Mark Berry
@MarkBerry rm -rf /path/to/directory/.*
Lilian A. Moraru
@ LilianA.Moraru, dzisiaj przeprowadziłem kilka testów. rm -rf /path/to/directory/.*usuwa tylko ukryte pliki w podanym katalogu. Patrząc na komentarz @ danjjl do odpowiedzi @ Rinzwind, aby również usunąć ukryte pliki, uruchom shopt -s dotglobprzed uruchomieniem rm -rf /path/to/directory/*.
Mark Berry
UWAGA: rm -rf /path/to/directory/.*w moim systemie spowodowałem usunięcie elementów w /path/to. Na szczęście właśnie utworzyłem kopię zapasową wszystkich danych na osobnym dysku. Nie trzeba dodawać, że NIE należy wydawać polecenia, rm -rf /path/to/directory/.*chyba że utworzono kopię zapasową całego komputera w osobnym / bezpiecznym miejscu!
prawnik
43

Aby usunąć wszystkie pliki w katalogu (w tym ukryte pliki i podkatalogi) uruchom:

rm -rf /path/to/directory/{*,.*}
Leonid V. Fedorenchik
źródło
1
To powinna być piękna, zaakceptowana odpowiedź. Dziękuję Ci!
Nam G VU
3
Czy ten glob nie pasuje do „.” i zbyt?
hertzsprung
4
@hertzsprung - to robi, a to daje ostrzeżenie, że nie można usunąć ./i ../, ale to nadal usuwać ukryte pliki.
Ryan Wheale
To nie działa na konsoli Mac, ukryte pliki są tam nadal z tym wierszem poleceń.
agapitocandemor
Aby usunąć wszystko z bieżącego katalogu:rm -r $(pwd)/{*,.*}
Jimmy Adaro
10

Jeśli chcesz usunąć tylko pliki z katalogu / path / to / możesz to zrobić

find /path/to/directory -type f -print0| xargs -0 rm 

lub

find /path/to/directory -type f -exec rm '{}' \;

Możesz ładować za pomocą find, zaletą jest to, że możesz wymienić to, co zostało znalezione bez przesyłania potokiem, rmabyś mógł zobaczyć, co zostanie usunięte przed rozpoczęciem.

Richard Holloway
źródło
2
GNU findjako -deleteorzeczenie. Jeśli nadal chcesz używać -exec, zastąpienie \;przez +spowoduje zebranie rmpołączeń razem, co zwiększy wydajność.
enzotib
1
duża liczba plików z „+” spowoduje problemy, ponieważ lista będzie zbyt duża, tak samo jak rm -f *. a przy usuwaniu dużych ilości plików z tego samego folderu (rozmawianie w milionach) oba nie są dobre :) W końcu przyszedł C ++ i usunął pliki w kolejności i-węzłów w katalogu drzewa.
Osis
3
Naprawdę powinieneś dodać - po rm. Bez tego, jeśli masz nazwy plików -rf lub podobne będą interpretowane jako argumenty do rm. np. xargs -0 rm - lub -exec rm - {} \;
Richm
możesz także podać argument -n xargs. Spowoduje to, że podzieli polecenia rm na maksymalną liczbę argumentów, tj. „Xargs -n 100 -0 rm -” usunie pliki w kawałkach po 100.
Richm
1
Możesz także dodać -maxdepth 1, aby upewnić się, że find nie zwróci plików z żadnych podkatalogów. tzn. znajdź / path / to / directory -maxdepth 1 -type f
Richm
7

Aby usunąć wszystkie pliki i katalogi (w tym ukryte ) z katalogu, możesz wykonać następujące czynności:

  • usuń folder, a następnie utwórz go ponownie

    rm -rf dir_name && mkdir dir_name
    
  • posługiwać się find

    find dir_name -mindepth 1 -delete  
    

Tutaj określamy, -mindepth 1aby wykluczyć sam katalog nazwa_katalogu.
Spójrz na następujący link:
https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory

zeekvfu
źródło
Dziękuję za radę i dodałem więcej wyjaśnień dla linków.
zeekvfu
3
Zachowaj ostrożność, ponieważ usunięcie i ponowne utworzenie folderu może skutkować różnymi / złymi uprawnieniami do tego folderu!
einjohn
6

Jeśli chcesz również usunąć wszystkie podkatalogi i sam katalog, możesz użyć rm -rf /path/to/directory. Ale zawsze dwukrotnie sprawdź linię przed naciśnięciem klawisza return, rm -rfmoże również powodować wiele spustoszeń, np. Jeśli przypadkowo wstawisz spację po pierwszym ukośniku, mając uprawnienia superużytkownika ...

Tobias Kienzler
źródło
1

Ponieważ to pytanie jest stale na szczycie Google, gdy sam go szukam:

Inne odpowiedzi mają różne problemy:

  1. Niektóre z nich obejmują .i ..które są głośne, mylące i denerwujące.

  2. Niektóre z nich zapominają ukryte pliki (pliki zaczynające się od kropki).

  3. Nie usuwają w prawidłowej (najgłębszej kolejności) kolejności, aby umożliwić usunięcie katalogu.

  4. Schodzą do innych (zamontowanych) systemów plików, co często jest niepożądane.

  5. Trudno je poprawnie rozszerzyć o dodatkowe parametry (więcej na ten temat poniżej).

Tak więc, ABY POWAŻNIE usuwać wszystkie pliki ORAZ foldery w katalogu, wykonaj następujące czynności:

find "${DIR}" -xdev -mindepth 1 -printf "%d\t%y\t%p\0" | sort -z -r -n | cut -z -f3- | xargs -0 -r -- rm -d --

Zauważ, że dodałem -xdevargument, aby zapobiec schodzeniu w wierzchowce (jak /procitp.).

Dlaczego nie -depthczy -delete?

Pomimo tego, że ludzie ciągle mnie za to głoszą, metody te mają swoje wady: nie wydaje się, aby były wystarczająco rozszerzalne, aby pozwolić -prunena podkatalog (bez wprowadzania dalszych problemów). W przeciwieństwie do tej metody można wstawić

-not \( -path "${DIR}/subdir" -prune \)

przed -mindepthargumentem wykluczającym subdirusunięcie jego zawartości.

Mehrdad
źródło
I dla pierwszego rzędu głębokości jest do tego -depthflaga find.
Sergiy Kolodyazhnyy
Uh ... dlaczego nie tylko korzystać -deletezfind ? -deletejest pierwsza głębokość. Jesteś już zakładając, nie POSIX-owych findz -printf, więc można równie dobrze wykorzystywać -deletealbo-depth -print0 | xargs -0 rm
Muru
@muru: Ponieważ nie wiedziałem lepiej ... zmienię to.
Mehrdad
@muru: Właściwie wydaje się, że twoja metoda nie działa -not \( -path "$DIR/subdir" \)... ale moja działa? Dlaczego?
Mehrdad
@ Mehrdad, co to ma zrobić?
muru
0

Możesz cdwejść do katalogu, a następnie, rm *.*jeśli pamiętasz, uruchomić polecenie tak jak w DOS.

VK Mavani
źródło
1
DOS jest DEL dla plików i RMDIR dla opróżnionych katalogów i plików ukrytych i systemowych musi najpierw usunąć te atrybuty ATTRIB. Nie tak proste;)
Eric
0

Aby usunąć bieżący katalog, możesz na przykład użyć rm -d ./*

-d mówi również o usunięciu katalogów.

arviman
źródło