Czy mają jakiś związek z faktycznym czasem tworzenia / modyfikacji? Bo findmógłbym to zrobić bez patrzenia na nazwę wtedy ...
Wrikken,
powinny mieć również czas tworzenia / modyfikacji
bobsr
4
Co masz na myśli mówiąc „starszy niż”? Czy odnosisz się do czasu utworzenia katalogu, ostatniej zmiany jego zawartości czy czegoś innego? Uważaj na niektóre z poniższych odpowiedzi; ctimeto czas zmiany i-węzła. W przypadku katalogu zmienia się po dodaniu lub usunięciu plików z katalogu.
ajk
Odpowiedzi:
390
To zrobi to rekurencyjnie:
find /path/to/base/dir/*-type d -ctime +10-exec rm -rf {} \;
Wyjaśnienie:
find: polecenie unixowe do wyszukiwania plików / katalogów / linków itp.
/path/to/base/dir: katalog, w którym rozpocznie się wyszukiwanie.
-type d: znajdź tylko katalogi
-ctime +10: rozważ tylko te, których czas modyfikacji jest starszy niż 10 dni
-exec ... \;: dla każdego takiego znalezionego wyniku wykonaj następujące polecenie w programie ...
rm -rf {}: rekurencyjnie wymuś usunięcie katalogu; {}część jest, gdy wynik znalezisko zostanie podstawiony do z poprzedniej części.
Alternatywnie użyj:
find /path/to/base/dir/*-type d -ctime +10| xargs rm -rf
Co jest nieco bardziej wydajne, bo sprowadza się do:
rm -rf dir1 dir2 dir3 ...
w przeciwieństwie do:
rm -rf dir1; rm -rf dir2; rm -rf dir3;...
jak w -execmetodzie.
Z nowoczesnych wersjach find, można wymienić ;z +i będzie to robić odpowiednikiem xargszaproszenia do Ciebie, przechodząc tyle plików, ile zmieści się na każdym exec wywołania systemowego:
-mtimebyło dla mnie lepsze, ponieważ sprawdza zmiany treści, a nie zmiany uprawnień, w przeciwnym razie było idealnie.
quickshift w
7
myślę, że spowoduje to również usunięcie samego katalogu podstawowego
lub Gal
3
@OrGal masz absolutną rację. Aby temu zapobiec, wystarczy użyć: find /path/to/base/dir/*.
zloynemec
11
możesz użyć -maxdepth 1, aby zignorować zawartość katalogów
Sam
7
Bardziej wydajne podejście może przynieść odwrotny skutek, jeśli masz zbyt wiele folderów do usunięcia: stackoverflow.com/questions/11289551/… . Z tego samego powodu, aby uniknąć usunięcia folderu podstawowego, lepiej jest użyć -mindepth 1(zamiast /path/to/folder/*).
Ohad Schneider
41
Jeśli chcesz usunąć wszystkie podkatalogi poniżej /path/to/base, na przykład
ale nie chcesz usuwać katalogu głównego /path/to/base, musisz dodać opcje -mindepth 1i -maxdepth 1, które będą miały dostęp tylko do podkatalogów pod/path/to/base
-maxdepth 1będzie tylko dopasować podkatalogi bezpośrednio pod /path/to/basetakimi jak /path/to/base/dir1, /path/to/base/dir2a /path/to/base/dir3jednak nie będzie lista podkatalogów z nich w sposób rekurencyjnego. Więc te przykładowe podkatalogi nie zostaną wymienione:
Myślę, że istnieje haczyk, że pliki muszą być starsze o ponad 10 dni. Nie próbowałem, ktoś może potwierdzić w komentarzach.
Brakuje tutaj rozwiązania z największą liczbą głosów, -maxdepth 0dlatego rm -rfpo usunięciu będzie ono wywoływać każdy podkatalog. To nie ma sensu, więc sugeruję:
find /base/dir/*-maxdepth 0-type d -ctime +10-exec rm -rf {} \;
Powyższe -deleterozwiązanie nie używa, -maxdepth 0ponieważ findnarzekałbym, że katalog nie jest pusty. Zamiast tego sugeruje -depthi usuwa od dołu do góry.
Mogę potwierdzić, że -deletedziała, ale tak jak powiedziałeś, możesz go używać tylko do usuwania pustych katalogów, podobnie jak rmdir.
CTodea,
3
Starałem się to naprawić, używając skryptów podanych powyżej i kilku innych skryptów, zwłaszcza gdy nazwy plików i folderów miały nową linię lub spacje.
W końcu natknąłem się na tmpreaper i do tej pory działał on całkiem nieźle.
Posiada funkcje takie jak test, który rekurencyjnie sprawdza katalogi i wyświetla je. Możliwość usuwania dowiązań symbolicznych, plików lub katalogów, a także trybu ochrony dla określonego wzorca podczas usuwania
find
mógłbym to zrobić bez patrzenia na nazwę wtedy ...ctime
to czas zmiany i-węzła. W przypadku katalogu zmienia się po dodaniu lub usunięciu plików z katalogu.Odpowiedzi:
To zrobi to rekurencyjnie:
Wyjaśnienie:
find
: polecenie unixowe do wyszukiwania plików / katalogów / linków itp./path/to/base/dir
: katalog, w którym rozpocznie się wyszukiwanie.-type d
: znajdź tylko katalogi-ctime +10
: rozważ tylko te, których czas modyfikacji jest starszy niż 10 dni-exec ... \;
: dla każdego takiego znalezionego wyniku wykonaj następujące polecenie w programie...
rm -rf {}
: rekurencyjnie wymuś usunięcie katalogu;{}
część jest, gdy wynik znalezisko zostanie podstawiony do z poprzedniej części.Alternatywnie użyj:
Co jest nieco bardziej wydajne, bo sprowadza się do:
w przeciwieństwie do:
jak w
-exec
metodzie.Z nowoczesnych wersjach
find
, można wymienić;
z+
i będzie to robić odpowiednikiemxargs
zaproszenia do Ciebie, przechodząc tyle plików, ile zmieści się na każdym exec wywołania systemowego:źródło
-mtime
było dla mnie lepsze, ponieważ sprawdza zmiany treści, a nie zmiany uprawnień, w przeciwnym razie było idealnie.find /path/to/base/dir/*
.-mindepth 1
(zamiast/path/to/folder/*
).Jeśli chcesz usunąć wszystkie podkatalogi poniżej
/path/to/base
, na przykładale nie chcesz usuwać katalogu głównego
/path/to/base
, musisz dodać opcje-mindepth 1
i-maxdepth 1
, które będą miały dostęp tylko do podkatalogów pod/path/to/base
-mindepth 1
wyklucza root/path/to/base
z dopasowań.-maxdepth 1
będzie tylko dopasować podkatalogi bezpośrednio pod/path/to/base
takimi jak/path/to/base/dir1
,/path/to/base/dir2
a/path/to/base/dir3
jednak nie będzie lista podkatalogów z nich w sposób rekurencyjnego. Więc te przykładowe podkatalogi nie zostaną wymienione:i tak dalej.
Tak więc, aby usunąć wszystkie podkatalogi, w
/path/to/base
których są starsze niż 10 dni;źródło
find
wspomaga-delete
działanie, więc:Myślę, że istnieje haczyk, że pliki muszą być starsze o ponad 10 dni. Nie próbowałem, ktoś może potwierdzić w komentarzach.
Brakuje tutaj rozwiązania z największą liczbą głosów,
-maxdepth 0
dlategorm -rf
po usunięciu będzie ono wywoływać każdy podkatalog. To nie ma sensu, więc sugeruję:Powyższe
-delete
rozwiązanie nie używa,-maxdepth 0
ponieważfind
narzekałbym, że katalog nie jest pusty. Zamiast tego sugeruje-depth
i usuwa od dołu do góry.źródło
-delete
działa, ale tak jak powiedziałeś, możesz go używać tylko do usuwania pustych katalogów, podobnie jakrmdir
.Starałem się to naprawić, używając skryptów podanych powyżej i kilku innych skryptów, zwłaszcza gdy nazwy plików i folderów miały nową linię lub spacje.
W końcu natknąłem się na tmpreaper i do tej pory działał on całkiem nieźle.
Oryginalny link do źródła
Posiada funkcje takie jak test, który rekurencyjnie sprawdza katalogi i wyświetla je. Możliwość usuwania dowiązań symbolicznych, plików lub katalogów, a także trybu ochrony dla określonego wzorca podczas usuwania
źródło
LUB
Zaktualizowana, szybsza wersja:
źródło
xargs --show-limits
.-print0
/ nie-0
zajmuje się znakami specjalnymi powłoki, czy nie?xargs
wersja będzie @mpen, ale pierwsza linia nie.