Witam.
Muszę napisać program który usunie mi w drzewie katalogów pliki starsze niż 2 miesiące, ale w każdym katalogu zostawi ostatni plik mimo że jest starszy niż 2 miesiące, tak żeby w każdym katalogu został chociaż jeden plik z najnowszą datą. Mam program już prawie gotowy nie mogę tylko znaleźć sposobu jak znaleźć pliki w drzewie, które ma podkatalogi. Czy ktoś ma jakiś pomysł?
[+] Perl - rekurencyjne przeszukiwanie katalogów
Pewnie dałoby się dobrać do listy takich plików findem, ma sporo opcji. Trzeba by manual przeczytać, a listę w jakąś tabelę wrzucić.
Bez użycia narzędzi systemowych, chyba ciekawsze rozwiązanie - zwykłe rekurencyjne przeszukiwanie katalogu. Perla nie znam więc opiszę tylko algorytm. Potrzebujemy na starcie tablicę/listę odwiedzonych katalogów. Począwszy od startowego katalogu:
1. Sprawdzamy czy są podkatalogi których nie odwiedziliśmy, jak nie ma to (3) jak są to (2)
2. Są podkatalogi, więc wchodzimy w pierwszy nie odwiedzony i wracamy do (1).
3. Sprawdzamy warunki dla plików i kasujemy te które je spełniają, przechodzimy do (4) chyba, że obecny katalog jest startowym, to kończymy.
4. Wychodzimy z katalogu, w górę, przedtem zapisujemy go do tablicy/listy odwiedzonych, przechodzimy do (1).
Mam nadzieję, że się w tym nie rąbnąłem gdzieś. Rekurencję można by zastąpić wielowątkowością - dla każdego katalogu nowy wątek, który tworzy następne jak natrafi na podkatalogi, a potem kasuje pliki zgodne z wzorcem.
Bez użycia narzędzi systemowych, chyba ciekawsze rozwiązanie - zwykłe rekurencyjne przeszukiwanie katalogu. Perla nie znam więc opiszę tylko algorytm. Potrzebujemy na starcie tablicę/listę odwiedzonych katalogów. Począwszy od startowego katalogu:
1. Sprawdzamy czy są podkatalogi których nie odwiedziliśmy, jak nie ma to (3) jak są to (2)
2. Są podkatalogi, więc wchodzimy w pierwszy nie odwiedzony i wracamy do (1).
3. Sprawdzamy warunki dla plików i kasujemy te które je spełniają, przechodzimy do (4) chyba, że obecny katalog jest startowym, to kończymy.
4. Wychodzimy z katalogu, w górę, przedtem zapisujemy go do tablicy/listy odwiedzonych, przechodzimy do (1).
Mam nadzieję, że się w tym nie rąbnąłem gdzieś. Rekurencję można by zastąpić wielowątkowością - dla każdego katalogu nowy wątek, który tworzy następne jak natrafi na podkatalogi, a potem kasuje pliki zgodne z wzorcem.
Dziękuję za pomoc, siedziałem wczoraj nad tym dosyć długo i znalazłem jakieś rozwiązanie wydaje mi się optymalne. Nie znalazłem sposobu żeby wykonać to poprzez wyszukiwanie plików więc doszedłem do wniosku, że trzeba zacząć od wyszukiwania katalogów rekurencyjnie i dla każdego katalogu sprawdzić jakie są pliki, ile itp. program działa. Może komuś przyda się takie rozwiązanie.
Na przyszłość polecam
Kod: Zaznacz cały
File::Find::Rule