„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ę.
-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.
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)
-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.
find . -type f -exec touch {} +jest interpretowany jako: touch a.txt b.txt Jest to podobne do sposobu działania xargs
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).
Odpowiedzi:
Istnieje kilka możliwości:
Użyj portu uniksowego
touch
polecenia i po prostu połączyćfind
itouch
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, odmv
idu
za pośrednictwem powłok Korna i C, doperl
aawk
. 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 matouch
ifind
, 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ścifind
obejścia ich przez Uniksa . (W końcu są one skierowane do bazy użytkowników, która szukatouch
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ć zFOR /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 jegoCOPY
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ę.źródło
COPY /B file+,,
droga jest najlepsza, nie wymaga dodatków ... :-)(ls file).LastWriteTime = DateTime.now
Ponieważ są one łatwo dostępne, polecam skorzystać z unxutils . Obejmują one polecenia
find
itouch
, które ułatwią to.Po przejściu do najwyższego katalogu, który chcesz zmodyfikować:
źródło
Aby użyć tylko istniejącej funkcjonalności systemu Windows (bez dodatkowej instalacji), wypróbuj jedną z następujących opcji:
(rekurencyjnie „dotknij” wszystkich plików rozpoczynających się w określonej ścieżce)
LUB
(rekurencyjnie „dotknij” wszystkich plików zaczynających się w bieżącym katalogu)
źródło
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ń.
źródło
Lub możesz użyć narzędzi już wbudowanych w system Windows, gdy już masz jakieś narzędzie dotykowe:
LUB
(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
)źródło
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:
Uwaga: nie użyłem opcji rekurencji.
źródło
Za pomocą programu PowerShell:
źródło
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 plikia.txt
ib.txt
find . -type f -exec touch {} +
jest interpretowany jako:touch a.txt b.txt
Jest to podobne do sposobu działania xargs
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).źródło
Używanie programu PowerShell dla bieżącego katalogu i wszystkich podkatalogów:
Lub możesz określić folder zaraz po
dir
.źródło