In Windows 7, come posso ricorsivamente toccare tutti i file in una directory (comprese le sottodirectory) per aggiornare la data / ora?
Windows 7 ha un meccanismo per raggiungere questo obiettivo?
In Windows 7, come posso ricorsivamente toccare tutti i file in una directory (comprese le sottodirectory) per aggiornare la data / ora?
Windows 7 ha un meccanismo per raggiungere questo obiettivo?
Risposte:
Esistono diverse possibilità:
Utilizzare una porta di un touch
comando Unix e combinare semplicemente find
e touch
in modo Unix. Ci sono diverse scelte Spesso menzionati sono GNUWin32 , cygwin e unxutils . Meno noti, ma in qualche modo migliori, sono gli strumenti del toolkit di utilità SFUA , che vengono eseguiti nel sottosistema per applicazioni basate su UNIX che è disponibile nella confezione con Windows 7 Ultimate Edition e Windows Server 2008 R2. (Per Windows XP, è possibile scaricare e installare i Servizi per UNIX versione 3.5 .) Questo toolkit ha un gran numero di strumenti TUI da riga di comando, da mv
e du
, attraverso le shell Korn e C, aperl
e awk
. È disponibile in entrambi i gusti x86-64 e IA64 e x86-32. I programmi vengono eseguiti nell'ambiente POSIX nativo di Windows, anziché con le DLL dell'emulatore (come cygwin1.dll
) che sovrappongono le cose su Win32. E sì, il toolkit ha touch
e find
, oltre a circa 300 altri.
Tutti questi toolkit hanno il noto svantaggio di eseguire un processo separato per ogni file da toccare, ovviamente. Questo non è un problema con le seguenti alternative.
Utilizzare uno dei tanti touch
comandi nativi Win32 che le persone hanno scritto e pubblicato. Molti di essi supportano le opzioni per eseguire la ricorsione, senza la necessità che un Unix find
li avvolga. (Dopotutto, stanno prendendo di mira una base di utenti che sta cercando un touch
comando perché non ha un intero carico di comandi Unix portati.) Uno di questi è Stéphane Duguaytouch
che come puoi vedere ha --recursive
un'opzione.
Diventa intelligente con gli arcani misteri di CMD. Come menzionato nell'altra risposta, COPY /B myfile+,,
aggiornerà il datestamp dell'ultima modifica di un file, usando la sintassi "più" poco nota del COPY
comando (maggiori informazioni su cui è possibile trovare qui , per inciso). Questo ovviamente può essere combinato con FOR /R
per eseguire l'operazione in modo ricorsivo, come suggerito in un'altra risposta qui.
Usa un interprete di comandi sostitutivo e sii meno intelligente e più diretto di CMD. TCC / LE di JP Software è uno di questi. Aggiunge /S
un'opzione al suo COPY
comando , il che significa che si potrebbe usare COPY /S
con la sintassi "più" per eliminare la necessità di un FOR
wrapper. Ma ciò rende davvero la vita inutilmente difficile per se stessi, considerando che TCC / LE ha un comando TOUCH integrato che supporta direttamente /S
un'opzione.
COPY /B file+,,
è la strada da percorrere, non richiede extra ... :-)
(ls file).LastWriteTime = DateTime.now
Per utilizzare solo le funzionalità di Windows esistenti (niente in più da installare) prova una di queste:
forfiles /P C:\Path\To\Root /S /C "cmd /c Copy /B @path+,,"
(ricorsivamente "tocca" tutti i file che iniziano nel percorso specificato)
O
forfiles /S /C "cmd /c Copy /B @path+,,"
("tocca" ricorsivamente tutti i file che iniziano nella directory corrente)
So che probabilmente è un po 'troppo tardi, ma lascerò la mia risposta nel caso in cui qualcun altro abbia bisogno della stessa cosa.
La risposta di John T non ha funzionato per me su Windows 7. Dopo alcune ricerche ho trovato questa utility chiamata SKTimeStamp , che fa perfettamente il lavoro.
Ecco un articolo con maggiori dettagli su come funziona: http://www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and -accessato / .
Ecco i passaggi che devi eseguire:
Ecco! Tutti i tuoi file sono stati aggiornati! Non è necessario alcun programma di utilità o riga di comando unix.
Oppure potresti usare gli strumenti già integrati in Windows, una volta che hai già uno strumento "touch" di qualche tipo:
for /r %i in (C:\Path\To\Root\*) do @touch "%i"
O
forfiles /P C:\Path\To\Root /S /C "touch @file"
(NB: se lo stai facendo da un file batch e vuoi usare il for
comando, assicurati di usare i segni del doppio percento per le tue variabili. (Es. %%i
Invece di %i
)
Utilizzando PowerShell:
C:\> powershell (ls your-file-name-here).LastWriteTime = Get-Date
The property 'LastWriteTime' cannot be found on this object.
In riferimento alla risposta di John T sopra:
Stavo cercando di capire la differenza tra la fine di un find
comando exec di a con un \;
e un `+ '(non avevo saputo di quest'ultimo).
Questo è stato utile: (da qui )
-exec command ;
Esegui comando; vero se viene restituito lo stato 0. Tutti i seguenti argomenti da trovare sono considerati argomenti per il comando fino a quando un argomento costituito da ';' è stato incontrato. La stringa '{}' viene sostituita dal nome del file corrente che viene elaborato ovunque si presenti negli argomenti del comando, non solo negli argomenti in cui è solo, come in alcune versioni di find.
-exec command {} +
Questa variante dell'azione -exec esegue il comando specificato sui file selezionati, ma la riga di comando viene creata aggiungendo alla fine ciascun nome di file selezionato; il numero totale di invocazioni del comando sarà molto inferiore al numero di file corrispondenti. La riga di comando è costruita nello stesso modo in cui xargs costruisce le sue righe di comando. Nel comando è consentita solo un'istanza di '{}'. Il comando viene eseguito nella directory iniziale.
Considera una cartella c:\myfolder
contenente 2 file a.txt
eb.txt
find . -type f -exec touch {} +
viene interpretato come: touch a.txt b.txt
find . -type f -exec touch {} \;
è interpretato come:touch a.txt
touch b.txt
Pertanto, # 1 è molto più veloce (ma soffre anche della limitazione che il comando seguente exec
può avere un solo {}
segnaposto).