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 🙂
Jak usuwać FOLDERY starsze niż x dni ??? na to pytanie nie mogę nigdzie znaleźć odpowiedzi. Oczywiście foldery nie są puste.
@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ń
Panie Łukaszu, czy mogę prosić o pomoc w takim przypadku?:
http://serverfault.com/questions/579347/desktop-backups-maintenance-on-a-network-share
Chodzi o kasowanie folderów wraz zawartością oprócz jednego, najnowszego, niezależnie od tego jak jest stary?
proszę 🙂
http://spece.it/windows-serwer-artykuly/skasowac-katalogi-oprocz-najnowszego
Hmm … no tak, tyle tylko iż to rozwiązanie zakłada że jesteśmy w jednym wybranym folderze = nie przeszukujemy struktury katalogów „w głąb” …
Proponuje przenieść dyskusję do właściwego wątku. (http://spece.it/windows-serwer-artykuly/skasowac-katalogi-oprocz-najnowszego).
Forfiles.exe nie będzie tu pomocny.
… a może Pan Piotr Berent byłby w stanie stworzyć jakiś skrypt w PowerShell ( wzorując się przykładowo na tym: http://nisanthkv.blog.com/2012/07/30/removing-backup-folders-solution-1/ ) ?
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.
Dzień Dobry. Scenariusze przenoszenia danych opisałem w artykule o RoboCopy. Forfiles sie do tego nie nadaje.
http://spece.it/windows-serwer-artykuly/robocopy-exe-zaawansowane-kopiowanie-synchronizowanie-raportowanie-danych
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.
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!
wszystko działa wspaniale, ale nie działa jeśli foldery/pliki mają atrybut „Ukryty”.
Jest na to rada ?
To zdaje się jest jedno z ograniczeń Forefiles. Próbowałeś użyć Robocopy?
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
witam,
mam system Windows Server 2019.
Kasuje foldery z bazą danych starsze niż 30 dni tymi poleceniami:
forfiles /p c:\baza /S /D -30 /C „cmd /c IF @isdir == TRUE rd /S /Q @path”
forfiles /p c:\baza /S /D -30 /C „cmd /c IF @isdir==FALSE Echo rd @path 2>Nul”
jednak jak już skasują się odpowiednie foldery, to w oknie cmd wyskakują informacje:
ERROR: nie można odnaleźć określonego pliku.
i tak ciągle.
Jak zrobić, by po skasowaniu okno CMD zamykało się automatycznie bez pokazywania komunikatów o błędzie, którego tak naprawdę nie ma?