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.