Jak w systemie Windows 7 mogę rekurencyjnie dotykać wszystkich plików w katalogu (w tym podkatalogów), aby zaktualizować znacznik daty / godziny?
Czy system Windows 7 ma mechanizm pozwalający to osiągnąć?
Jak w systemie Windows 7 mogę rekurencyjnie dotykać wszystkich plików w katalogu (w tym podkatalogów), aby zaktualizować znacznik daty / godziny?
Czy system Windows 7 ma mechanizm pozwalający to osiągnąć?
Odpowiedzi:
Istnieje kilka możliwości:
Użyj portu uniksowego touchpolecenia i po prostu połączyć findi touchna drodze Unix. Istnieje kilka opcji. Często wymieniane są GNUWin32 , cygwin i unxutils . Mniej znane, ale pod pewnymi względami lepsze, są narzędzia z zestawu narzędzi SFUA , które działają w Podsystemie aplikacji dla systemu UNIX, który jest dostępny w pudełku z Windows 7 Ultimate Edition i Windows Server 2008 R2. (W przypadku systemu Windows XP można pobrać i zainstalować usługi dla systemu UNIX w wersji 3.5 .) Ten zestaw narzędzi zawiera dużą liczbę narzędzi TUI wiersza polecenia, od mvi duza pośrednictwem powłok Korna i C, doperla awk. Występuje zarówno w wersjach x86-64 i IA64, jak i x86-32. Programy działają w natywnym środowisku POSIX systemu Windows, a nie z emulatorowymi bibliotekami DLL (np. cygwin1.dll) Nakładającymi warstwy na Win32. I tak, zestaw narzędzi ma touchi find, jak również około 300 innych.
Oczywiście wszystkie te zestawy narzędzi mają tę wadę, że uruchamiają osobny proces dla każdego pliku, który ma zostać dotknięty. To nie jest problem z następującymi alternatywami.
Użyj jednego z wielu rodzimych touchpoleceń Win32 , które ludzie napisali i opublikowali. Wiele z nich obsługuje opcje wykonywania rekurencji, bez konieczności findobejścia ich przez Uniksa . (W końcu są one skierowane do bazy użytkowników, która szuka touchpolecenia, ponieważ nie ma całego ładunku przeniesionych poleceń Uniksa.) Jednym z nich jest Stéphane Duguay,touch który, jak widać, ma --recursiveopcję.
Bądź sprytny dzięki tajemnym tajemnicom CMD. Jak wspomniano w innych odpowiedzi, COPY /B myfile+,,zaktualizuje ostatnia modyfikacja DATESTAMP danego pliku, używając mało znany „plus” składnię COPYpolecenia (więcej na której można znaleźć tutaj , nawiasem mówiąc). Można to oczywiście połączyć z FOR /Rrekurencyjnym wykonaniem operacji, jak wskazano w innej odpowiedzi tutaj.
Użyj zastępczego interpretera poleceń i bądź mniej sprytny i prostszy niż CMD. TCC / LE firmy JP Software jest taką. To dodaje /Sopcję na jego COPYpolecenia , co oznacza, że można korzystać COPY /Sz „plus” składni, aby wyeliminować potrzebę FORowijki. Ale to naprawdę sprawia, że życie staje się niepotrzebnie trudne, biorąc pod uwagę, że TCC / LE ma wbudowane polecenie TOUCH, które bezpośrednio obsługuje /Sopcję.
COPY /B file+,,droga jest najlepsza, nie wymaga dodatków ... :-)
(ls file).LastWriteTime = DateTime.now
Aby użyć tylko istniejącej funkcjonalności systemu Windows (bez dodatkowej instalacji), wypróbuj jedną z następujących opcji:
forfiles /P C:\Path\To\Root /S /C "cmd /c Copy /B @path+,,"
(rekurencyjnie „dotknij” wszystkich plików rozpoczynających się w określonej ścieżce)
LUB
forfiles /S /C "cmd /c Copy /B @path+,,"
(rekurencyjnie „dotknij” wszystkich plików zaczynających się w bieżącym katalogu)
Wiem, że to chyba trochę za późno, ale zostawię swoją odpowiedź na wypadek, gdyby ktoś inny potrzebował tego samego.
Odpowiedź Johna T. nie działała dla mnie w systemie Windows 7. Po kilku badaniach znalazłem to narzędzie o nazwie SKTimeStamp , które doskonale sobie radzi.
Oto artykuł ze szczegółowymi informacjami na temat jego działania: http://www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and -accessed / .
Oto kroki, które musisz wykonać:
Voila! Wszystkie twoje pliki zostały zaktualizowane! Nie potrzeba żadnych narzędzi unixowych ani wiersza poleceń.
Lub możesz użyć narzędzi już wbudowanych w system Windows, gdy już masz jakieś narzędzie dotykowe:
for /r %i in (C:\Path\To\Root\*) do @touch "%i"
LUB
forfiles /P C:\Path\To\Root /S /C "touch @file"
(Uwaga: jeśli robisz to z pliku wsadowego i chcesz użyć forpolecenia, pamiętaj o zastosowaniu znaków podwójnego procentu dla swoich zmiennych. (Np. %%iZamiast %i)
Za pomocą programu PowerShell:
C:\> powershell (ls your-file-name-here).LastWriteTime = Get-Date
The property 'LastWriteTime' cannot be found on this object.
W nawiązaniu do powyższej odpowiedzi Johna T.
Próbowałem zrozumieć różnicę między zakończeniem findkomendy exec \;a a + (nie wiedziałem o tym ostatnim).
Przydało się to: ( stąd )
-exec command ;
Wykonaj polecenie; true, jeśli zwracany jest status 0. Wszystkie następujące argumenty do znalezienia są uważane za argumenty polecenia, dopóki argument składający się z „;” napotkano. Ciąg „{}” jest zastępowany bieżącą nazwą pliku przetwarzaną wszędzie tam, gdzie występuje w argumentach polecenia, a nie tylko w argumentach, w których jest on sam, jak w niektórych wersjach find.
-exec command {} +
Ten wariant akcji -exec uruchamia określone polecenie na wybranych plikach, ale linia poleceń jest budowana przez dołączenie każdej wybranej nazwy pliku na końcu; całkowita liczba wywołań polecenia będzie znacznie mniejsza niż liczba dopasowanych plików. Linia poleceń jest budowana w taki sam sposób, jak xargs buduje swoje linie poleceń. W poleceniu dozwolona jest tylko jedna instancja „{}”. Polecenie jest wykonywane w katalogu startowym.
Rozważ folder c:\myfolderzawierający 2 pliki a.txtib.txt
find . -type f -exec touch {} +jest interpretowany jako: touch a.txt b.txtfind . -type f -exec touch {} \;jest interpretowany jako:touch a.txttouch b.txtW związku z tym nr 1 jest znacznie szybszy (ale także cierpi z powodu ograniczenia, że następujące polecenie execmoże mieć tylko jeden {}symbol zastępczy).