Skrypt Bash do usuwania plików starszych niż x dni z podkatalogami

37

Próbuję usunąć tonę plików starszych niż x dni.

Teraz mam skrypt, aby to zrobić

find /path/to/files* -mtime +10 -exec rm {} \; 

Spowoduje to również usunięcie podkatalogów. Istnieje mnóstwo folderów, ale chciałbym je zachować i usunąć pliki starsze niż 10 dni w tych folderach.

Czy jest na to sposób?

JoyIan Yee-Hernandez
źródło

Odpowiedzi:

50

type opcja filtrowania wyników

findakceptuje typeopcję wyboru, na przykład, tylko plików.

find /path/to/files -type f -mtime +10 -delete

Pomiń, -deleteaby pokazać, co by usunął, a kiedy to zweryfikujesz, idź dalej i uruchom pełne polecenie.

To działałoby tylko na plikach, a nie katalogach. Użyj -type ddla odwrotnego, tylko katalogów pasujących do twoich argumentów.


Opcje dodatkowe

Możesz przeczytać man find, ponieważ istnieje kilka dodatkowych opcji, które mogą być potrzebne w przyszłości. Na przykład -maxdepthpozwoliłbyś ograniczyć znalezione elementy tylko do określonej głębokości, np. -maxdepth 0Nie powróciłby do podkatalogów.

Kilka uwag

  • Zastanawiam się, w jaki sposób polecenie usunęłoby folder, ponieważ nie można usunąć folderu rmtylko. Potrzebujesz rm -rtego.

  • Jest także /path/to/files*mylące. Czy miałeś na myśli, /path/to/files/czy spodziewasz się, że symbol wieloznaczny rozszerzy się na kilka nazw plików i folderów?

  • Wstaw {}pojedyncze cudzysłowy, tzn. '{}'Aby uniknąć interpretacji powłoki przez podany plik / katalog, tak jak chronimy średnik odwrotnym ukośnikiem.

slhck
źródło
Cóż, w katalogu / path / to / files / znajduje się wiele folderów. Właściwie chciałbym uruchomić mtime +10 -exec rm do każdego z tych folderów, ale zachować same foldery, w zasadzie chciałbym to osiągnąć, aby usunąć wszystkie pliki starsze niż 10 dni i zachowaj wszystkie foldery. Przepraszam za tę nowość :)
JoyIan Yee-Hernandez
Cóż, proszę bardzo :) Po prostu zrób find /path/to/files* -type f -mtime +10i zobacz, co by to wyszło .
slhck
Tak, jeśli masz wątpliwości, nie rób tego -exec, po prostu zobacz, co znajdzie najpierw.
Rob
2
@ JoyIanYee-Hernandez Możesz również użyć -deleteargumentu do find, który usuwa wszystkie pliki i foldery, ten ostatni tylko wtedy, gdy jest pusty. To implikuje -depth, tzn. Pierwsze wyszukiwanie w głębi.
Daniel Beck
1
@Kreker Następnie należy dodać, -mindepth 1aby wykluczyć katalog nadrzędny.
slhck
5

Podobnie jak w poprzednich odpowiedziach (+1 dla obu), sztuczką jest użycie -type fpredykatu.

Zauważ, że zamiast -exec rm '{}'ciebie możesz również użyć -deletepredykatu. Ale nie rób tego. Dzięki -exec rm '{}'niemu możesz (i powinieneś) najpierw zrobić, -exec echo rm '{}'aby sprawdzić, czy naprawdę tego właśnie chcesz. Następnie ponownie uruchom komendę bez echo.

Korzystanie -deletejest szybsze (bez dodatkowych fork()i execve()dla każdego pliku), ale jest to ryzykowne, ponieważ -deletedziała również jako warunek, więc:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

ale jeśli TYLKO zamienisz argumenty:

# delete ALL files
find . -type f -name '*.tmp' -delete

Jeśli kiedykolwiek potrzebujesz findi rmpracujesz szybciej dla mnóstwa plików, sprawdź find ... | xargs ... rmidiom UNIX.

Michał Šrajer
źródło
4
Myślę, że twoje dwa ostatnie przykłady są dokładnie takie same, może chcesz to poprawić!
slhck
1

Możesz to łatwo zrobić za pomocą polecenia find

$ find -type f

Co ogranicza wyniki do pliku typu

Bernhard
źródło
1

Walczyłem o to, korzystając ze skryptów podanych powyżej i niektórych innych skryptów, zwłaszcza gdy nazwy plików i folderów zawierały znak nowej linii lub spacje.

W końcu natknąłem się na tmpreaper i do tej pory udało nam się całkiem dobrze.

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

Oryginalny link źródłowy

Posiada funkcje takie jak test, który rekursywnie sprawdza katalogi i wyświetla je. Możliwość usuwania dowiązań symbolicznych, plików lub katalogów, a także tryb ochrony dla określonego wzorca podczas usuwania

użytkownik52573
źródło
0

Aby przyspieszyć polecenie, użyj '+'zamiast\;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

Uruchomi się to rmtylko raz na końcu zamiast za każdym razem, gdy plik zostanie znaleziony.
( rmmoże być uruchamiany kilka razy, jeśli masz naprawdę mnóstwo plików z powodu ograniczenia długości wiersza poleceń, ale wciąż jest to prawie tak szybkie, jak przy użyciu -delete)

olibre
źródło
0

rm -f find /path/to/files -type file -mtime -5

Spowoduje to usunięcie plików zmodyfikowanych w ciągu 5 dni

rm -f find /path/to/files -type file -mtime +5

Spowoduje to usunięcie plików zmodyfikowanych przed 5 dniami

Użyj `przed znajdź i na końcu po 5.

Nikhil Shinde
źródło