Po tym poradniku będziesz umieć usunąć pojedynczy plik, pusty katalog, całe drzewo katalogów oraz pliki wybrane według nazwy lub wieku, za każdym razem sprawdzając wcześniej, co dokładnie zostanie skasowane. W wierszu poleceń Linuksa nie ma kosza: usunięcie jest ostateczne. Dlatego sposób postępowania jest tak samo ważny jak sama komenda.
Wymagania wstępne
- Dostęp do powłoki na maszynie z Linuksem (lokalnie lub przez SSH), na przykład na serwerze VPS z Linuksem
- Użytkownik z prawem zapisu w danym katalogu (lub dostęp do
sudo) - Świeża kopia zapasowa wszystkiego, co jest ważne
Sprawdź cel przed usunięciem
Przejdź do właściwego katalogu i wyświetl jego zawartość. Zajmuje to dwie sekundy, a pozwala uniknąć większości wpadek.
Bashpwd ls -la
Jeśli używasz wzorca (rozszerzenia, prefiksu), najpierw wyświetl, czego dotyczy. Polecenie rm otrzyma dokładnie tę samą listę.
Bashls -d *.log
Usuń plik
Podstawowym poleceniem jest rm.
Bashrm report.txt
Dodaj -i, aby polecenie prosiło o potwierdzenie, oraz -v, aby wyświetlało, co usuwa.
Bashrm -iv report.txt
Następnie sprawdź wynik poleceniem ls report.txt: komunikat „No such file or directory" potwierdza, że plik zniknął.
Usuń wiele plików
Znaki wieloznaczne powłoki pozwalają wskazać całą grupę plików. Najpierw wyświetl listę przez ls, potem usuń.
Bashrm -v *.tmp rm -v photo_{01..05}.jpg
Unikaj gołego rm * w katalogu, co do którego nie masz pewności. Jeśli nazwa pliku zaczyna się od myślnika, użyj --, aby zaznaczyć koniec opcji:
Bashrm -- -strange-file.txt
Usuń pusty katalog
rmdir usuwa wyłącznie puste katalogi. To zamierzone: działa jak zabezpieczenie.
Bashrmdir old_folder
Aby usunąć również katalogi nadrzędne, które staną się puste:
Bashrmdir -p project/cache/tmp
Usuń katalog wraz z całą zawartością
Potrzebna jest tu opcja rekurencyjna -r. Najpierw oszacuj, co stracisz.
Bashdu -sh old_project find old_project -type f | wc -l
Potem usuń, z potwierdzeniem:
Bashrm -ri old_project
Przy tysiącach plików potwierdzanie każdego z nich jest niepraktyczne. Opcja -f wyłącza pytania:
Bashrm -rf old_project
Nigdy nie wstawiaj do tego polecenia niesprawdzonej zmiennej. W rm -rf "$DIR"/ pusta zmienna $DIR oznacza, że celujesz w katalog główny. W skrypcie dodaj set -u lub użyj "${DIR:?}", co przerwie wykonanie, jeśli zmienna jest pusta.
Usuń pliki według wieku
find filtruje według precyzyjnych kryteriów (nazwa, typ, wiek, rozmiar). Zasada jest prosta: najpierw uruchom polecenie bez akcji, a dopiero potem dodaj -delete.
Bashfind /var/log/myapp -type f -name "*.log" -mtime +30
Jeśli lista zgadza się z oczekiwaniami:
Bashfind /var/log/myapp -type f -name "*.log" -mtime +30 -delete
-mtime +30 oznacza pliki zmodyfikowane ponad 30 dni temu. Umieszczaj -delete na końcu: find ocenia warunki od lewej do prawej, więc -delete postawione zbyt wcześnie usunie wszystko.
Bezpieczniej wymaż plik z wrażliwymi danymi
rm usuwa wpis o pliku, ale niekoniecznie dane z dysku. shred nadpisuje zawartość przed usunięciem.
Bashshred -u -v secret.key
Ta metoda ma ograniczenia na dyskach SSD, w systemach plików z księgowaniem (journaling) oraz na woluminach ze snapshotami, gdzie dawne dane mogą pozostać. Przy naprawdę wrażliwych danych niezawodnym rozwiązaniem jest szyfrowanie dysku od samego początku.
Napraw typowe błędy
Permission denied
Nie masz prawa zapisu w katalogu nadrzędnym (to on kontroluje usuwanie, a nie sam plik). Sprawdź przez ls -ld DIRECTORY, a jeśli to uzasadnione, użyj sudo:
Bashsudo rm -v /path/to/file
Operation not permitted, nawet z sudo
Plik prawdopodobnie ma ustawiony atrybut niezmienności (immutable). Sprawdź go, zdejmij, a potem usuń plik.
Bashlsattr file.txt sudo chattr -i file.txt sudo rm file.txt
Argument list too long
Znak wieloznaczny rozwinął się do większej liczby argumentów, niż system przyjmuje. Użyj find, który przetwarza pliki jeden po drugim:
Bashfind . -maxdepth 1 -type f -name "*.tmp" -delete
Directory not empty lub Device or resource busy
W przypadku rmdir pierwszy komunikat jest normalny: katalog zawiera pliki, także ukryte (ls -A). Jeśli korzysta z niego punkt montowania lub proces, zidentyfikuj go przez lsof +D DIRECTORY albo findmnt, zwolnij katalog i spróbuj ponownie.
Do bezpiecznych ćwiczeń przydaje się tymczasowa instancja: na VPS możesz utworzyć katalog testowy i pomylić się bez żadnych konsekwencji. Więcej poradników tego typu znajdziesz w sekcji poradniki.
FAQ
Czy można odzyskać plik usunięty poleceniem rm?
Rzadko i bez gwarancji. Narzędzia takie jak extundelete czy testdisk czasem odnajdują dane, jeśli natychmiast przestaniesz zapisywać cokolwiek na dysku. Jedyną niezawodną ochroną jest kopia zapasowa.
Jaka jest różnica między rm -r a rm -rf?
rm -r usuwa rekurencyjnie, ale pyta o potwierdzenie przy plikach chronionych przed zapisem. rm -rf wymusza usunięcie i po cichu pomija nieistniejące pliki. Zarezerwuj je na sytuacje, w których cel został już sprawdzony.
Jak usunąć katalog, którego nazwa zawiera spacje?
Ujmij nazwę w cudzysłów lub poprzedź spacje ukośnikiem: rm -r "My folder" albo rm -r My\ folder. W przeciwnym razie powłoka potraktuje każde słowo jako osobny element.
Czy w wierszu poleceń istnieje kosz?
Tak, w pakiecie trash-cli (polecenie trash-put), który przenosi elementy do kosza użytkownika zamiast je kasować. Na serwerze rzadko jest zainstalowany domyślnie, więc wyrób sobie nawyk wyświetlania listy przed usuwaniem.