Jak znaleźć i usunąć pliki starsze niż określone dni w Uniksie?


38

Mam jeden folder dziennika z 7 folderami. Te siedem folderów również ma podfoldery, a te podfoldery również mają podfoldery. Chcę usunąć wszystkie pliki starsze niż 15 dni we wszystkich folderach, w tym w podfolderach, bez dotykania struktury folderów, co oznacza tylko pliki.

mahesh@inl00720:/var/dtpdev/tmp/ > ls
A1  A2  A3  A4  A5  A6  A7

mahesh@inl00720:/var/dtpdev/tmp/A1/ > ls
B1 B2 B3 B4 file1.txt file2.csv

Odpowiedzi:


54

Możesz zacząć od powiedzenia find /var/dtpdev/tmp/ -type f -mtime +15. Spowoduje to znalezienie wszystkich plików starszych niż 15 dni i wydrukowanie ich nazw. Opcjonalnie możesz określić -printna końcu polecenia, ale jest to akcja domyślna. Wskazane jest, aby najpierw uruchomić powyższe polecenie, aby zobaczyć, które pliki są wybrane.

Po sprawdzeniu, czy findpolecenie wyświetla listę plików, które chcesz usunąć (i żadnych innych), możesz dodać „akcję”, aby usunąć pliki. Typowe działania w tym celu to:

  1. -exec rm -f {} \;(lub równoważnie -exec rm -f {} ';')
    To będzie działać rm -fna każdym pliku; na przykład,

    rm -f /var/dtpdev/tmp/A1/B1; rm -f /var/dtpdev/tmp/A1/B2; rm -f /var/dtpdev/tmp/A1/B3; …
    
  2. -exec rm -f {} +
    To będzie działać rm -fna wielu plikach jednocześnie; na przykład,

    rm -f /var/dtpdev/tmp/A1/B1 /var/dtpdev/tmp/A1/B2 /var/dtpdev/tmp/A1/B3 …
    

    więc może być nieco szybszy niż opcja 1. (Może być konieczne uruchomienie rm -fgo kilka razy, jeśli masz tysiące plików).

  3. -delete
    To każe findsobie usunąć pliki, bez uruchamiania rm. Może to być nieskończenie szybsze niż -execwarianty, ale nie będzie działać na wszystkich systemach.

Tak więc, jeśli użyjesz opcji 2, całe polecenie będzie:

find /var/dtpdev/tmp/ -type f -mtime +15 -exec rm -f {} +

Użycie opcji -delete jest prostsze (składnia i brak procesów potomnych wykonujących usuwanie), ale może nie działać we wszystkich systemach. rm -f {} + jest najlepszy, usunie pliki partiami, jeśli będzie wystarczającej liczby plików, aby było ich za dużo dla jednego wiersza poleceń. rm -f {} ';' poda zbyt długi błąd polecenia, jeśli jest wystarczająca ilość plików, aby było za dużo dla jednego wiersza polecenia.
gaoithe

-1

Lub zrób to za pomocą pętli:

for x in $(find /var/dtpdev/tmp/ -type f -mtime +15); do rm "$x"; done

To nie będzie działać z plikami ze spacjami.
Drav Sloan

Zamiast tego możesz użyć pętli while, która powinna zająć się plikami ze spacjami. find / var / dtpdev / tmp / -type f -mtime +15 | podczas odczytu x; do rm "$ x"; zrobione
David Okwii
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.