Polecenie dotykowe rekurencyjne Windows

17

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ąć?

jmq
źródło
możliwy duplikat Windows odpowiednika polecenia Linux „touch”?
Wstrzymano do odwołania.
„Akceptowana” odpowiedź w tym łączu dotyczy korzystania z bibliotek programowania .NET w celu osiągnięcia tego dla jednego pliku. Pozostałe dotyczyły dodania menu kontekstowego do aktualizacji pojedynczych plików. Szukałem wbudowanego polecenia, aby zrobić to rekurencyjnie do plików N. Poniższa odpowiedź działała w przypadku wszystkich plików. To nie jest wbudowane, ale działa. Dzięki.
jmq
Nie jest to także kopia systemu Windows dla komendy dotykowej Unix , ponieważ to pytanie dotyczy konkretnie rekurencji. Należy jednak pamiętać, że kilka odpowiedzi na to pytanie ma formy rekurencyjne.
JdeBP

Odpowiedzi:

19

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ę.

JdeBP
źródło
2
+1, COPY /B file+,,droga jest najlepsza, nie wymaga dodatków ... :-)
Tamara Wijsman
3
Sposób Powershell:(ls file).LastWriteTime = DateTime.now
Tamara Wijsman
5

Ponieważ są one łatwo dostępne, polecam skorzystać z unxutils . Obejmują one polecenia findi touch, które ułatwią to.

Po przejściu do najwyższego katalogu, który chcesz zmodyfikować:

odnaleźć . -type f -exec touch {} +
John T.
źródło
5

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)

Sven Roepke
źródło
3
-1 Jak-te polecenia kopiują pliki z podfolderów do katalogu głównego, co powoduje bałagan.
TonyG
1
+1 Mały zwrot, aby naprawić to, co powiedział @TonyG: forfiles / S / C "cmd / c Copy / B nul: + ,,"
Alex Dupuis
nie zmienia ostatniej modyfikacji
beppe9000,
4

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ć:

  • Zainstaluj aplikację
  • Przejdź do katalogu, w którym musisz zmienić znaczniki czasu
  • Wyszukaj * w polu wyszukiwania, aby eksplorator pokazywał wszystkie pliki
  • Po znalezieniu wszystkich plików zaznacz je wszystkie, kliknij je prawym przyciskiem myszy i wybierz polecenie Właściwości
  • W oknie dialogowym wybierz kartę Znaczniki czasu
  • Dostosuj daty i godziny według potrzeb i kliknij Touch

Voila! Wszystkie twoje pliki zostały zaktualizowane! Nie potrzeba żadnych narzędzi unixowych ani wiersza poleceń.

Andris
źródło
1

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)

afrazier
źródło
1

Nie udało mi się to także w systemie Windows 7. Użyłem innej składni i sprawiłem, że działała:

forfiles /c "cmd /c touch @file"

Uwaga: nie użyłem opcji rekurencji.

jemiah
źródło
1

Za pomocą programu PowerShell:

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date
ThiagoAlves
źródło
To nie działa dla mnie:The property 'LastWriteTime' cannot be found on this object.
Ben N
Działa dla mnie w systemie Windows Server 2012: (ls. \ Backup_db_20150810.sql) .LastWriteTime = Get-Date
ThiagoAlves
0

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

  1. find . -type f -exec touch {} +jest interpretowany jako:
    touch a.txt b.txt
    Jest to podobne do sposobu działania xargs

  2. mając na uwadze, że 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 execmoże mieć tylko jeden {}symbol zastępczy).

Ashutosh Jindal
źródło
Świetny komentarz z dobrymi informacjami, ale bez odpowiedzi na pytanie. Dałby +1, gdyby to był komentarz.
TonyG
1
:) Nie pamiętam, aby zrobić ten post :)
Ashutosh Jindal
0

Używanie programu PowerShell dla bieżącego katalogu i wszystkich podkatalogów:

dir -R | foreach { $_.LastWriteTime = [System.DateTime]::Now }

Lub możesz określić folder zaraz po dir.

icl7126
źródło