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 touch
polecenia i po prostu połączyć find
i touch
na 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 mv
i du
za pośrednictwem powłok Korna i C, doperl
a 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 touch
i 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 touch
poleceń Win32 , które ludzie napisali i opublikowali. Wiele z nich obsługuje opcje wykonywania rekurencji, bez konieczności find
obejścia ich przez Uniksa . (W końcu są one skierowane do bazy użytkowników, która szuka touch
polecenia, ponieważ nie ma całego ładunku przeniesionych poleceń Uniksa.) Jednym z nich jest Stéphane Duguay,touch
który, jak widać, ma --recursive
opcję.
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ę COPY
polecenia (więcej na której można znaleźć tutaj , nawiasem mówiąc). Można to oczywiście połączyć z FOR /R
rekurencyjnym 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 /S
opcję na jego COPY
polecenia , co oznacza, że można korzystać COPY /S
z „plus” składni, aby wyeliminować potrzebę FOR
owijki. 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 /S
opcję.
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ć for
polecenia, pamiętaj o zastosowaniu znaków podwójnego procentu dla swoich zmiennych. (Np. %%i
Zamiast %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 find
komendy 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:\myfolder
zawierający 2 pliki a.txt
ib.txt
find . -type f -exec touch {} +
jest interpretowany jako: touch a.txt b.txt
find . -type f -exec touch {} \;
jest interpretowany jako:touch a.txt
touch b.txt
W związku z tym nr 1 jest znacznie szybszy (ale także cierpi z powodu ograniczenia, że następujące polecenie exec
może mieć tylko jeden {}
symbol zastępczy).