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.
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:
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.
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
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)
find /path/to/files* -type f -mtime +10
i zobacz, co by to wyszło .-exec
, po prostu zobacz, co znajdzie najpierw.-delete
argumentu dofind
, który usuwa wszystkie pliki i foldery, ten ostatni tylko wtedy, gdy jest pusty. To implikuje-depth
, tzn. Pierwsze wyszukiwanie w głębi.-mindepth 1
aby wykluczyć katalog nadrzędny.Podobnie jak w poprzednich odpowiedziach (+1 dla obu), sztuczką jest użycie
-type f
predykatu.Zauważ, że zamiast
-exec rm '{}'
ciebie możesz również użyć-delete
predykatu. 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ę bezecho
.Korzystanie
-delete
jest szybsze (bez dodatkowychfork()
iexecve()
dla każdego pliku), ale jest to ryzykowne, ponieważ-delete
działa również jako warunek, więc:ale jeśli TYLKO zamienisz argumenty:
Jeśli kiedykolwiek potrzebujesz
find
irm
pracujesz szybciej dla mnóstwa plików, sprawdźfind ... | xargs ... rm
idiom UNIX.źródło
Możesz to łatwo zrobić za pomocą polecenia find
Co ogranicza wyniki do pliku typu
źródło
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.
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
źródło
Aby przyspieszyć polecenie, użyj
'+'
zamiast\;
Uruchomi się to
rm
tylko raz na końcu zamiast za każdym razem, gdy plik zostanie znaleziony.(
rm
moż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
)źródło
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.
źródło