Jak usunąć wszystkie pliki z katalogu?

76

Próbuję usunąć wszystkie pliki i podkatalogi z katalogu. Zwykłem rm -rusuwać wszystkie pliki, ale chcę usunąć wszystkie pliki i podkatalogi, z wyjątkiem samego katalogu głównego.

Na przykład mam topowy katalog jak images. Zawiera pliki header.png, footer.pnga podkatalog.

Teraz chcę usunąć header.png, footer.pngi podkatalogu, ale nie images.

Jak mogę to zrobić w systemie Linux?

poorani
źródło
1
cd do katalogu i wykonaj rm -Rfwszystkie znajdujące się tam pliki i katalogi.
Noufal Ibrahim

Odpowiedzi:

59

Jeśli zostanie wywołany katalog najwyższego poziomu images, uruchom rm -r images/*. To używa globalnego operatora powłoki *do działania rm -rna każdym pliku lub katalogu images.


źródło
30
ukryty plik nie zostanie usunięty.
reto
50

Aby usunąć ukryte pliki, musisz określić:

rm -r images/* images/.*

W przypadku powłok, których globusy zawierają .i .., spowoduje to błąd podobny do

rm: cannot remove `.' directory `images/.'
rm: cannot remove `..' directory `images/..'

ale usunie ukryte pliki.

Podejście bez błędów polega na użyciu find / delete z mindepth. To jest gnu-find.

find images -mindepth 1 -delete

W znalezieniu może brakować predykatu -mindepthlub -delete, w takim przypadku możesz wykonać:

find images/. ! -name . -prune -exec rm -rf {} +
nieznany użytkownik
źródło
Moją sugestią było użycie „rm -r images /.*”, które pasowałoby do „images / ..”, ale nie do „images /../ ..”. Rekurencja nie może iść w górę, ponieważ „images /../ images / ..” znów jest tym samym katalogiem.
użytkownik nieznany
4
@DarkHeart rm .*nie usuwa .albo ..i nie ma co najmniej od 1994 roku dla GNU utils i prawdopodobnie od końca lat 70-tych dla systemu UNIX . Jest bardzo mało prawdopodobne, abyś znalazł system, w którym system rm .*plików przechodzi w górę poza muzeum.
terdon
21

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

  • służy ls -Abdo dopasowania wszystkich plików / katalogów

    cd dir_name && rm -rf `ls -Ab`
    
  • służy finddo dopasowania wszystkich plików / katalogów

    find dir_name -mindepth 1 -delete
    

    lub jeśli findnie obsługuje -delete:

    find dir_name -mindepth 1 -exec rm -rf {}
    
  • usuń folder, a następnie utwórz go ponownie

    rm -rf dir_name && mkdir dir_name
    
  • w bash

    shopt -s dotglob  
    rm -rf dir_name/*
    
zeekvfu
źródło
Zauważ, że polecenie like rm -rf *nie jest bezpieczne, jeśli nie masz wiedzy o plikach w katalogu, ponieważ plik rozpoczynający się od -(myślnik) będzie interpretowany jako rmflaga ...
VasyaNovikov
1
EDYCJA: aby zrobić to bezpiecznie, użyjrm -rf ./* ./.*
VasyaNovikov
9

Aby usunąć wszystkie zwykłe pliki rekurencyjnie w katalogu, to polecenie (przy założeniu GNU lub FreeBSD find) jest wystarczająco dobre:

find . -type f -delete

To pozostawia wszystkie nieregularne pliki, takie jak dowiązania symboliczne (niezależnie od tego, czy wskazują zwykłe pliki, czy nie), katalogi, piątki, gniazda, urządzenia ...

Zobacz też:

find . ! -type d -delete

aby usunąć pliki dowolnego typu oprócz katalogu .

amit singh
źródło
6

Wypróbuj tę wersję:

 rm -r test/*
demas
źródło
1
Nie spowoduje to usunięcia ukrytych plików (zaczynających się od „.”).
gbmhunter
3

Używam findtutaj polecenia:

Krok 1: Znajdź wszystkie pliki i usuń je:

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

Przykład:

find /home/user/Desktop/images/ -type f -exec rm {} \;

Krok 2: Znajdź wszystkie podkatalogi i usuń je:

find /path/to/directory/ -type d -exec rm -R {} \;
Mandar Shinde
źródło
find /path/to/directory/ -type dzawiera .więc usunie sam katalog. Musisz także użyć -mindepthprzełącznika, jak powiedzieli inni.
Arthur Tacca
3

Pytanie polegało na opróżnieniu katalogu = usunięcie zawartości katalogu, w tym ukrytych plików, ale nie samego katalogu. Polecenie find z opcją -mindepth 1 jest właściwie właściwą drogą, ale aby uniknąć komunikatów o błędach, należy połączyć je z opcją -maxdepth 1:

find /path/to/dir -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;
Maddes
źródło
0

Składnia rm jest następująca:

rm [OPTION]... FILE...

Musisz więc wyraźnie podać odpowiednią ścieżkę, np

rm -r sub_dir/
Zaur Nasibow
źródło
0

Możesz usunąć katalog za pomocą następującego polecenia:

sudo rm -r directoryname1/2/3/*

Zostanie usunięty cały katalog po 3 / *.

Przykład sudo rm -r Pliki do pobrania / piosenka / *

Zostaną usunięte wszystkie zawarte w nim pliki Downloads/song.

Dharmendra Rajput
źródło
0

Działa to dla mnie idealnie, przetestowałem za każdym razem kilka wariantów.

Z katalogu zawierającego katalog obrazów.

rm -frd ./images/*

przed:

images/
    |_ header.png
    |_ footer.png
    |_ subdir/

po:

images/
użytkownik deb-linux
źródło
Nie jestem pewien, czy zostało to wyjaśnione w pierwotnym pytaniu, ale tylko zaznaczając, że jeśli nie włączysz dotglob, spowoduje to pominięcie dowolnego „pliku-kropki” lub katalogu-kropki w obrazach ( mkdir images/.somedir; touch images/.somefile)
Jeff Schaller
0

Aby usunąć wszystkie pliki i podkatalogi w bieżącym katalogu, w tym ukryte, bez komunikatu o błędzie :

rm -rf .[^.] .??* *

Lub z katalogu nadrzędnego:

rm -rf images/.[^.] images/.??* images/*

Od https://serverfault.com/a/47940/269538 .

to
źródło
-2

Usuń folder „test” i wszystkie pliki w nim:

 rm -r test

Usuń wszystkie pliki, ale zachowaj folder „test”:

 rm -r test/*
Mike22LFC
źródło
-4

cd do folderu, a następnie wykonaj następujące polecenie:

ls |xargs rm -rf
Sean
źródło
2
Nie powiedzie się to w nazwach plików zawierających białe znaki. Odradzałbym używanie wyjścia ls jako danych wejściowych do innych poleceń, jest to generalnie niebezpieczne.
dhag