15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij
15.12.2023

Usuwanie wszystkich plików w folderze w Linux: Kompletny przewodnik techniczny

Usuwanie plików w Linux oznacza ich trwałe usunięcie z systemu plików bez natywnego kosza ani mechanizmu cofania. Podstawowym narzędziem do tej operacji jest polecenie rm, uzupełnione przez find, rsync oraz rozwijanie globów powłoki — każde odpowiednie do różnych scenariuszy, od usuwania pojedynczych plików po masowe czyszczenie oparte na kryteriach obejmujące miliony i-węzłów.

Ponieważ usuwanie plików w Linux jest domyślnie nieodwracalne, zrozumienie dokładnego zachowania każdej metody — w tym sposobu obsługi dowiązań symbolicznych, ukrytych plików, punktów montowania i otwartych deskryptorów plików — nie jest opcjonalne. To różnica między czystym zadaniem konserwacyjnym a katastrofalną utratą danych w środowisku produkcyjnym.

Dlaczego usuwanie plików w Linux wymaga precyzji

Gdy usuwasz plik za pomocą rm, jądro zmniejsza liczbę twardych dowiązań pliku. Rzeczywiste bloki danych są zwalniane dopiero wtedy, gdy liczba ta osiągnie zero i żaden proces nie posiada otwartego deskryptora pliku do i-węzła. Ma to dwie praktyczne konsekwencje:

  • Działający proces może nadal odczytywać „usunięty” plik, jeśli otworzył deskryptor pliku przed usunięciem. Miejsce na dysku nie jest odzyskiwane do momentu zamknięcia lub zakończenia procesu.
  • Usunięcie wpisu katalogu nie gwarantuje natychmiastowego odzyskania miejsca na dysku w zajętych systemach.

W środowisku VPS Hosting lub na Serwerze Dedykowanym, gdzie wiele usług współdzieli ten sam system plików, zrozumienie tego zachowania zapobiega dezorientacji, gdy df nie wykazuje zwolnionego miejsca po dużym usunięciu.

Metoda 1: Podstawowe usuwanie plików za pomocą rm

Polecenie rm to standardowe narzędzie POSIX do usuwania plików i wpisów katalogów.

rm /path/to/filename

Kluczowe flagi:

FlagaZachowanie
-fWymusza usunięcie; pomija błędy dla nieistniejących plików i nigdy nie wyświetla monitu
-iTryb interaktywny; wyświetla monit przed każdym usunięciem
-IWyświetla monit raz przed usunięciem więcej niż 3 plików lub rekurencją
-vTryb szczegółowy; wyświetla nazwę każdego usuwanego pliku
-r / -RRekurencyjny; usuwa katalogi i całą ich zawartość

Usuwanie wszystkich plików w katalogu bez usuwania samego katalogu:

rm /path/to/folder/*

Krytyczna pułapka — ukryte pliki nie są dopasowywane przez *: Glob * nie rozszerza się na pliki z kropką (pliki zaczynające się od .). Aby usunąć również ukryte pliki:

rm /path/to/folder/* /path/to/folder/.[!.]* /path/to/folder/..?*

Wzorzec .[!.]* dopasowuje wszystkie pliki z kropką z wyjątkiem . i ... Wzorzec ..?* obsługuje przypadki brzegowe takie jak ..foo. Pominięcie tych wzorców jest jednym z najczęstszych błędów podczas czyszczenia katalogów konfiguracyjnych aplikacji.

Metoda 2: Rekurencyjne usuwanie za pomocą rm -r

Aby usunąć katalog i wszystko w nim — pliki, podkatalogi i ich zawartość:

rm -r /path/to/folder/

Przechodzi przez drzewo katalogów w głąb, usuwając pliki przed ich katalogami nadrzędnymi. Na bardzo głębokich drzewach rm -r może osiągnąć limit stosu rekurencji jądra, choć w praktyce zdarza się to rzadko.

Łączenie z -f do nieinteraktywnego użycia w skryptach:

rm -rf /path/to/folder/

To najniebezpieczniejsza kombinacja w administracji systemami Linux. Usunie wszystko pod podaną ścieżką bez żadnego potwierdzenia, w tym dowiązania symboliczne (ale nie ich cele), pliki specjalne i katalogi. Bez kopii zapasowej nie ma możliwości odzyskania danych.

Rzeczywisty przypadek brzegowy: Jeśli przypadkowo dodasz spację przed ścieżką w skrypcie:

rm -rf $TARGET_DIR /

Jeśli $TARGET_DIR jest puste lub nieustawione, a powłoka nie ma włączonego nounset (set -u), rozszerza się to do rm -rf /, co próbuje wymazać główny system plików. Zawsze używaj set -u w skryptach produkcyjnych i cytuj zmienne: "$TARGET_DIR".

Metoda 3: Usuwanie oparte na kryteriach za pomocą find

Polecenie find jest właściwym narzędziem, gdy musisz usuwać pliki na podstawie atrybutów, a nie tylko nazwy. Zapewnia chirurgiczną precyzję, której samo rm nie może zaoferować.

Usuń tylko zwykłe pliki w katalogu (bez rekurencji):

find /path/to/folder -maxdepth 1 -type f -delete

Usuń pliki starsze niż 30 dni:

find /path/to/folder -type f -mtime +30 -delete

Usuń pliki większe niż 100 MB:

find /path/to/folder -type f -size +100M -delete

Usuń pliki z określonym rozszerzeniem:

find /path/to/folder -type f -name "*.log" -delete

Usuń puste katalogi po wyczyszczeniu ich zawartości:

find /path/to/folder -type d -empty -delete

find -exec rm vs. find -delete

PodejścieMechanizmWydajnośćBezpieczeństwo
find ... -exec rm {} ;Tworzy nowy proces rm dla każdego plikuWolne przy dużej liczbie plików (narzut fork)Nieco bardziej przenośne
find ... -exec rm {} +Grupuje pliki w jedno wywołanie rmZnacznie szybsze; podobne do xargsPrzenośne, wydajne
find ... -deleteWywołanie unlinkat() jądra bezpośrednio z findNajszybsze; bez podprocesuWymaga kolejności -depth dla katalogów

Zawsze preferuj -delete lub -exec rm {} + zamiast -exec rm {} ; przy pracy z tysiącami plików. Narzut fork() na plik w formie ze średnikiem może sprawić, że czyszczenie 100 000 plików zajmie minuty zamiast sekund.

Ważna reguła kolejności: Gdy używasz -delete do usuwania zarówno plików, jak i ich katalogów nadrzędnych w jednym przebiegu find, zawsze dodaj -depth, aby przetwarzać zawartość katalogów przed samymi katalogami:

find /path/to/folder -depth -delete

Bez -depth polecenie find może próbować usunąć katalog przed jego zawartością, powodując błędy Directory not empty.

Metoda 4: Używanie rozwijania globów powłoki z bash

W scenariuszach, gdzie chcesz opróżnić zawartość katalogu bez uruchamiania zewnętrznych procesów, wbudowane rozwijanie globów Bash w połączeniu z rm jest wydajne:

shopt -s dotglob nullglob
rm -rf /path/to/folder/*/
rm -f /path/to/folder/*
shopt -u dotglob nullglob
  • dotglob sprawia, że * uwzględnia ukryte pliki.
  • nullglob zapobiega otrzymaniu przez rm dosłownego *, gdy katalog jest już pusty, co spowodowałoby błąd.

Metoda 5: Wysokowydajne usuwanie za pomocą rsync

Gdy katalog zawiera miliony plików, rm -rf może być bardzo wolne, ponieważ musi osobno wywołać stat() i unlink() dla każdego i-węzła. Dobrze znana technika administratorów systemów polega na użyciu rsync do synchronizacji pustego katalogu z docelowym:

mkdir /tmp/empty_dir
rsync -a --delete /tmp/empty_dir/ /path/to/folder/
rmdir /tmp/empty_dir

rsync używa wysoce zoptymalizowanego przechodzenia katalogów i może przewyższać rm -rf na systemach plików z milionami małych plików (typowych w kolejkach pocztowych, pamięciach podręcznych sesji i katalogach sesji PHP). Jest to praktyczna technika na każdym Serwerze Dedykowanym obsługującym aplikacje o dużym ruchu.

Metoda 6: Obcinanie plików bez ich usuwania

Czasami musisz wyczyścić zawartość pliku bez usuwania i-węzła — szczególnie w przypadku plików dziennika, które trzyma otwarty działający demon. Usunięcie i ponowne utworzenie pliku zerwałoby otwarty deskryptor pliku.

Obetnij do zera bajtów zachowując i-węzeł:

> /path/to/logfile.log

Lub równoważnie:

truncate -s 0 /path/to/logfile.log

To właściwy sposób czyszczenia aktywnych plików dziennika na działającym serwerze. Użycie rm na otwartym pliku dziennika zwalnia wpis katalogu, ale demon kontynuuje zapis do teraz niewidocznego i-węzła, zużywając miejsce na dysku do momentu restartu procesu.

Porównanie wszystkich metod usuwania

MetodaUsuwa ukryte plikiRekurencyjneOparte na kryteriachWydajność przy dużych zbiorachPoziom ryzyka
rm fileNie dotyczyNieNieWysokaNiski
rm *Nie (bez dotglob)NieNieWysokaŚredni
rm -rf dir/TakTakNieŚredniaBardzo wysoki
find -deleteTakKonfigurowalneTakWysokaŚredni
find -exec rm {} +TakKonfigurowalneTakŚrednio-wysokaŚredni
rsync --deleteTakTakNieBardzo wysoka (miliony plików)Niski
truncate / >Nie dotyczyNieNieBardzo wysokaBardzo niski

Uprawnienia, własność i bit sticky

Usuwanie plików w Linux jest regulowane przez uprawnienia katalogu, a nie uprawnienia pliku. Aby usunąć plik, potrzebujesz uprawnień do zapisu (w) i wykonania (x) w katalogu nadrzędnym — nie w samym pliku. To zaskakuje wielu użytkowników, którzy odkrywają, że nie mogą usunąć pliku, którego są właścicielem, znajdującego się w katalogu należącym do innego użytkownika.

Bit sticky (chmod +t /dir) w katalogu (najbardziej znany przykład to /tmp) ogranicza usuwanie tak, że tylko właściciel pliku, właściciel katalogu lub root może usuwać pliki, niezależnie od uprawnień do zapisu w katalogu. Jest to kluczowe w środowiskach hostingu współdzielonego.

Na platformie Hostingu Współdzielonego bit sticky i właściwa własność katalogów zapobiegają usuwaniu plików jednego użytkownika przez skrypty innego użytkownika we współdzielonych katalogach tymczasowych.

Bezpieczne podglądanie usunięć przed wykonaniem

Przed uruchomieniem jakiegokolwiek destrukcyjnego polecenia w środowisku produkcyjnym, sprawdź podgląd tego, co zostanie usunięte:

Podgląd za pomocą find przed usunięciem:

find /path/to/folder -type f -mtime +30

Uruchom najpierw bez -delete. Przekieruj przez wc -l, aby policzyć pliki, których dotyczy operacja:

find /path/to/folder -type f -mtime +30 | wc -l

Próbne uruchomienie z rsync:

rsync -a --delete --dry-run /tmp/empty_dir/ /path/to/folder/

Użyj ls do weryfikacji rozwijania globów:

ls /path/to/folder/* /path/to/folder/.[!.]*

Nigdy nie zastępuj tego kroku założeniami, szczególnie w systemach, gdzie zmienne środowiskowe definiują ścieżki.

Bezpieczna automatyzacja zadań czyszczenia

Na serwerach produkcyjnych — zarówno instancjach VPS Hosting, jak i serwerach bare-metal Dedykowanych — automatyczne czyszczenie jest zazwyczaj zarządzane przez cron lub timery systemd. Solidny skrypt czyszczący powinien przestrzegać następujących zasad:

#!/bin/bash
set -euo pipefail

TARGET="/var/app/cache"

# Validate target is not empty and is a directory
if [[ -z "$TARGET" || ! -d "$TARGET" ]]; then
    echo "ERROR: Invalid target directory." >&2
    exit 1
fi

# Delete files older than 7 days
find "$TARGET" -type f -mtime +7 -delete
echo "Cleanup complete: $TARGET"

Kluczowe środki obronne w tym skrypcie:

  • set -euo pipefail — kończy działanie przy każdym błędzie, traktuje nieustawione zmienne jako błędy i przechwytuje błędy potoków.
  • Jawna walidacja katalogu przed jakimkolwiek usunięciem.
  • Cytowane zmienne w całym skrypcie, aby zapobiec podziałowi słów.

W przypadku aplikacji webowych zarządzanych przez panel sterowania, VPS z cPanel zapewnia zarządzanie zadaniami cron przez GUI, zmniejszając ryzyko błędów składniowych w zaplanowanych zadaniach usuwania.

Uwagi dotyczące konkretnych systemów plików

Różne systemy plików Linux obsługują usuwanie w różny sposób, co wpływa zarówno na wydajność, jak i możliwość odzyskania danych:

  • ext4: Używa dziennika. Metadane usuniętych plików są zapisywane w dzienniku przed zwolnieniem i-węzła. Niektóre narzędzia kryminalistyczne mogą odzyskać niedawno usunięte pliki z dzienników ext4.
  • XFS: Zoptymalizowany pod kątem dużych plików i wysokowydajnego usuwania. rm -rf na XFS z milionami plików jest znacznie szybsze niż na ext4 dzięki indeksowaniu katalogów w strukturze B-drzewa.
  • Btrfs: Obsługuje migawki. Usunięcie pliku w podwolumenie Btrfs nie zwalnia miejsca, jeśli migawka odwołuje się do tych samych bloków danych. Zawsze sprawdzaj użycie migawek za pomocą btrfs subvolume list przed oczekiwaniem na odzyskanie miejsca na dysku.
  • tmpfs: System plików w pamięci. Usunięcie jest natychmiastowe, a miejsce jest odzyskiwane od razu. Powszechnie używany dla /tmp i przechowywania sesji.
  • Montowania NFS: Usuwanie plików przez NFS tworzy tymczasowe pliki .nfsXXXXXX, jeśli zdalny proces ma otwarty plik. Są one czyszczone po zamknięciu zdalnego deskryptora pliku.

Kluczowa lista kontrolna przed usuwaniem plików na serwerze Linux

  • Potwierdź dokładną ścieżkę za pomocą pwd i ls przed wykonaniem jakiegokolwiek polecenia rm.
  • Użyj find bez -delete najpierw, aby wyświetlić podgląd listy plików.
  • Sprawdź otwarte deskryptory plików za pomocą lsof +D /path/to/folder przed usunięciem plików w aktywnych katalogach aplikacji.
  • Sprawdź, czy żaden działający proces nie zależy od katalogu za pomocą fuser -m /path/to/folder.
  • Na Btrfs sprawdź migawki przed oczekiwaniem na zwolnienie miejsca na dysku.
  • Używaj set -euo pipefail we wszystkich automatycznych skryptach usuwania.
  • Cytuj wszystkie zmienne w skryptach, aby zapobiec przypadkowemu usunięciu na poziomie roota.
  • W przypadku plików dziennika trzymanych otwartych przez demony używaj obcinania (> lub truncate -s 0) zamiast rm.
  • W systemach współdzielonych sprawdź uprawnienia katalogu i ustawienia bitu sticky przed założeniem, że usunięcie się powiedzie.
  • Utrzymuj aktualne kopie zapasowe. Żadna metoda usuwania nie jest bezpieczna bez zweryfikowanej ścieżki odzyskiwania.

FAQ

P: Czy rm -rf /path/to/folder/* usuwa ukryte pliki?

Bez włączenia dotglob w Bash, glob * nie rozszerza się na pliki zaczynające się od kropki. Ukryte pliki takie jak .env, .htaccess i .gitignore pozostaną. Użyj shopt -s dotglob przed poleceniem lub jawnie dodaj .[!.]* do wzorca glob.

P: Dlaczego miejsce na dysku nie jest zwalniane natychmiast po usunięciu dużych plików?

Jeśli działający proces posiada otwarty deskryptor pliku do usuniętego pliku, jądro utrzymuje przydzielone bloki danych do momentu zamknięcia tego deskryptora. Użyj lsof | grep deleted, aby zidentyfikować procesy trzymające otwarte usunięte pliki. Ponowne uruchomienie odpowiedniej usługi lub procesu zwolni miejsce.

P: Jaki jest najbezpieczniejszy sposób opróżnienia katalogu zawierającego miliony plików?

Metoda rsync --delete (synchronizacja pustego katalogu z docelowym) jest generalnie najbardziej wydajnym i najmniej podatnym na błędy podejściem przy bardzo dużej liczbie plików. Pozwala uniknąć limitu długości listy argumentów powłoki (E2BIG), który może osiągnąć rm *, i jest szybsza niż wywołania rm na plik na większości systemów plików.

P: Czy usunięte pliki można odzyskać w Linux?

Domyślnie Linux nie ma kosza. Jednak na systemach plików ext4 niedawno usunięte pliki mogą być odzyskiwalne za pomocą narzędzi takich jak extundelete lub testdisk, jeśli dysk nie był intensywnie zapisywany od czasu usunięcia. Na Btrfs z włączonymi migawkami odzyskiwanie jest proste poprzez przywrócenie migawki. Dlatego utrzymywanie kopii zapasowych jest niezbędne w każdym środowisku produkcyjnym.

P: Jak usunąć pliki w katalogu bez usuwania samego katalogu?

Użyj find /path/to/folder -mindepth 1 -delete, aby usunąć całą zawartość — w tym ukryte pliki i podkatalogi — pozostawiając nienaruszony katalog nadrzędny. Alternatywnie, rm -rf /path/to/folder/* z włączonym dotglob osiąga ten sam rezultat tylko dla najwyższego poziomu.

15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij