FORFILES i zaawansowane wyszukiwanie, przenoszenie i kasowanie plików po dacie modyfikacji

Jeśli chcecie wykonać jakieś operacje na starych plikach (skasować je lub gdzieś przenieść) lub w jakimś dowolnym celu musicie wyłowić pliki po dacie ich modyfikacji, to dzisiejszy artykuł powinien dla Was przydatny. Podam Wam przykłady użycia wbudowanego w Windows polecenia FORFILES, które idealnie nada się do zautomatyzowania takich zadań.

Każdy, kto miał kiedyś do czynienia z dużym folderem danych, wie, że ręczne znajdź /kopiuj/wklej w explorerze zadziała dla małych ilości danych, a dużych raczej nie… Samo zainicjowanie kopiowania trwa długo i nawet jeśli już się rozpocznie, to na pewno coś je przerwie i będziemy musieli zaczynać od nowa.

Program FORFILES występuje natywnie w Windowsach od czasów Windows Vista. Wcześniej, dostępny był w pakiecie Windows 2000 Rescue Kit.

Jesli używacie starszej wersji Windows, możecie go ściągnąc bezpośrednio z :

http://www.dynawell.com/download/reskit/microsoft/win2000/forfiles.zip


Spójrzmy, co pozwoli nam osiągnąć polecenie FORFILES:

W ten oto sposób wyświetlimy wszystkie pliki i foldery modyfikowane w ciągu ostatnich 5 dni w bieżącym katalogu:

forfiles /D +5

Parametr /S to wyszukiwane rekursywne (folder bieżący i pod-foldery):

forfiles /S /D +5

Można wskazać konkretną ścieżkę:

forfiles /P d:\SPECE_IT\dane /S /D +10

A teraz wyszukiwanie odwrotne, czyli szukamy plików i folderów NIE-modyfikowanych w ciągu ostatnich 3 dni:

forfiles /S /D -3

Możemy też sprecyzować datę. Na przykład znajdźmy pliki modyfikowane od szóstego sierpnia 2013:

forfiles /P directory /S /D +08/06/2013

Brak wyników i kwestia długiej listy
Gdy nie będzie żadnych wyników, ujrzymy:

ERROR: No files found with the specified search criteria.

Przeważnie lista znalezionych wyników będzie długa. Możemy ją na przykład wyświetlać porcjami za pomocą dopisku „| more”, lub zapisać w pliku tekstowym z „>plik.txt”.

Operacje na wynikach
Najczęściej jednak, naszą intencją będzie zrobienie czegoś ze znalezionymi plikami. FORFILES sprytnie pozwala podpiąć komendę do znalezionych plików (np. skasowanie lub przeniesienie).

W ten sposób przeniesiemy pliki NIE-modyfikowane od 30 dni z katalogu bieżącego do katalogu d:\archiwum:

forfiles /S /D -30 /C „cmd /c move @file D:\archiwum”

W ten sposób przeniesiemy pliki modyfikowane w ciągu 2 dni z katalogu bieżącego do katalogu d:\nowe:

forfiles /S /D +2 /C „cmd /c move @file D:\nowe”

Tak skasujemy pliki starsze niż 365 dni:

forfiles /D -365 „cmd /C del @file”

Kasowanie i przenoszenie plików można potraktować jako uzupełnienie artykułu Piotra o czyszczeniu dysku.

Niedawno kolega Rafał również brał się za masowe operacje na plikach, ale z racji mniejszej skali środowisko GUI świetnie się do tego nadawało. Zachęcam do przypomnienia sobie artykułów o masowym tworzeniu folderów i masowej zmianie nazw.

Jeśli szukacie narzędzia do raportowania i przenoszenia wielkiej ilości danych z całym mnóstwem opcji, koniecznie zapoznajcie się z moim artykułem o programie Robocopy.exe 🙂

Łukasz Skalikow

Obecnie Manager IT. Przez lata byłem Inżynierem systemów. Jestem entuzjastą i specem od vSphere, Windows serwer, GPO. Od zawsze byłem zwolennikiem wiersza poleceń i automatyzacji. Obecnie, ze względu na pracę, rodzinę i wyjazdy służbowe, dużo mniej udzielam się na blogu, ale mam nadzieję, że pośród kilkuset porad opublikowanych na spece.it, wiele osób znajdzie dla siebie coś przydatnego :)

Przeczytaj także...

15 komentarzy

  1. eRRor napisał(a):

    Jak usuwać FOLDERY starsze niż x dni ??? na to pytanie nie mogę nigdzie znaleźć odpowiedzi. Oczywiście foldery nie są puste.

  2. Łukasz Skalikow napisał(a):

    @error
    Oto rozwiązanie:

    forfiles /S /D -100 /C „cmd /c IF @isdir == TRUE rd /S /Q @path”

    -100 to oczywiście ilość dni.

    cmd /c pozwala dołączyć polecenie DOSowe (w artykule jest MOVE, DEL) więc zadziała tez kasowanie katalogów (RD).

    RD /S – kasowanie wraz z zawartością
    RD /Q – kasowanie bez potwierdzeń

  3. Zdzich napisał(a):

    Panie Łukaszu, czy mogę prosić o pomoc w takim przypadku?:
    http://serverfault.com/questions/579347/desktop-backups-maintenance-on-a-network-share

  4. Mariusz napisał(a):

    Witam serdecznie Panie Łukaszu,
    bardzo dziękuję za Pana opis, miałbym do Pana prośbę o pomoc w napisaniu skryptu do przeniesienia plików starszych niż 2010-01-01 z folderu d:\roota do folderu k:\archiwum\, tylko potrzebuje przenieść te pliki razem z ich ściezką, tak, aby w przypadku, gdyby okazało się, że bedę musiał przywrócić w przyszłości te pliki, to bedę w stanie odtworzyć ich ścieżkę. Z góry bardzo dziękuję za Pana pomoc.

  5. radoart napisał(a):

    Witam, A jak zapisać komendy forfiles jako skrypt, gdyż wszystkie działają pięknie wpisywane do cmd jak tylko zapisać w notatniku (obojetnie w jakim kodowaniu znaków) i nadaniu .bat, przestają działąć, komp nie rozumie skłądni.

  6. MAREK napisał(a):

    Witam, pisałem do was na FB ale zapytam i tu. Potrzebuje pomocy w napisaniu skryptu. Potrzebuje w konkretnym folderze zamienić nazwy plików. Np. :
    FOTO_1234556_JANUARY_2014_WIOSNA.jpg
    na następujące:
    FOTO_1234556_WIOSNA.jpg
    Jaką składnię użyć ?
    Plik wykonywalny w BAT
    Pozdrawiam!

  7. Jacek napisał(a):

    wszystko działa wspaniale, ale nie działa jeśli foldery/pliki mają atrybut „Ukryty”.
    Jest na to rada ?

    • Łukasz Skalikow napisał(a):

      To zdaje się jest jedno z ograniczeń Forefiles. Próbowałeś użyć Robocopy?

  8. k2i napisał(a):

    witam ,bardzo pomocny artykuł.Ja mam prośbę o pomoc.

    Chce zautomatyzować sprawdzanie czy wczoraj lub dziś zrobiły się backupy systemów, chce podawać np w pliku tekstowym ścieżki (do katalogów) gdzie forfiles ma szukać plików – jesli w danej sciezce nie bedzie pliku to chce otrzymać informacje zwrotna o tym (albo komunikat błędu). Na koniec potrzebuje otrzymać w jednym pliku zbiorczym raport np:raportDATA.txt listę plików utworzonych (i nieutworzonych) od wczoraj ze ścieżką, godzina i rozmiarem.

    Fajnie by było potem żeby automatycznie sprawdzało czy pliki zwiększają czy zmniejszają swój rozmiar + np wykres – ale to pewnie osobny skrypt

    proszę o jakieś wskazówki
    pozdrawiam

Dodaj komentarz