Usuń wszystkie pliki utworzone przed określoną datą


26

Mam katalog zawierający dużą liczbę plików (takich jak dzienniki na każdy dzień roku). Chciałbym usunąć wszystkie pliki utworzone przed, powiedzmy, 22/11. Jak mogę to osiągnąć? Czy muszę użyć findnastępnie exec -rm? Używam ksh.


1
Zazwyczaj zastrzeżeniem jest to, że system plików Unix na ogół nie zawierają zapis, kiedy plik został stworzony - tylko czasy, że i-węzeł i zawartość były ostatnio zmodyfikowano są dostępne.
— Toby Speight

Odpowiedzi:


35

Używanie findjest nadal preferowanym sposobem usuwania plików. Więcej informacji można znaleźć na stronie http://mywiki.wooledge.org/UsingFind .

Jednym ze sposobów jest utworzenie pliku ze znacznikiem czasu. na przykład

touch -t 201311220000 /tmp/timestamp

Teraz usuń pliki GNU find(zakładając w bieżącym katalogu), które pasują do znacznika czasu, np .:

find . -type f ! -newer /tmp/timestamp -delete  

lub znajdź GNU

find . -type f ! -newer /tmp/timestamp -exec rm {} \;

2
A co z tym ? Czy to działa ? znajdź -type f -mtime +5 -exec rm -f {} \;
— user1058398,

1
@ user1058398 Spowoduje to usunięcie plików starszych niż 5 dni od teraz.
— Valentin Bajrami

Czy usuwa również folder wraz z plikami? @ val0x00ff
— alper

1
@ Avatar nie, ponieważ type -fogranicza działanie tylko do plików.
— Valentin Bajrami,

22

Z GNU lub niektórymi BSD find:

find . ! -newermt 2013-11-22 ! -type d -delete

Pamiętaj, że sprawdza czas ostatniej modyfikacji plików. W przypadku niektórych plików BSD można -newerBtzamiast tego -newermtsprawdzić czas urodzenia i- węzła pliku, jeśli jest dostępny.


1
find /path/to/directory/ -mtime +<number of days> -name '<file name>' -exec rm -rf {} \;

przykład:

find /Netap_fileshare_backup/SQL/DB_backups/xeo/ -mtime +15 -name 'ORA_XEO*' -exec rm -rf {} \;

W takim przypadku usunie wszystkie pliki, które zaczynają się na „ORA_XEO” na więcej niż 15 dni.


Chociaż lepiej to obejrzeć rm -rf, pierwsze polecenie usunie wszystko, co jest w katalogach starszych niż te 15 dni. (Także, dlaczego nawias wokół -name?)
— ilkkachu

Masz rację, nie musimy wstawiać „(” „)”.
— calafate

ale jeśli chcemy dodać warunek, może być przydatny. na przykład, jeśli chcemy usunąć wszystkie pliki, które kończą się na „.jar” lub „.cp” i zacząć od „ex”. example.jar- zostanie usunięty example.cp- zostanie usunięty example.tar- nie zostanie usunięty
— calafate

w tym przypadku możemy użyć:find /path/to/directory/ -mtime +<number of days> \( -name '*.jar' -o -name '*.cp' \) -name 'ex*' -exec rm -rf {} \;
— calafate

Spowoduje to usunięcie niektórych plików z <liczba dni> zamiast wszystkich plików starszych niż <liczba dni>, chyba że uruchomisz go dokładnie o północy i zakończy się w ciągu sekundy. W GNU findpowinieneś użyć -daystartmodyfikatora, aby wymusić -mtimewartość do północy.
— roaima,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.