Comando touch ricorsivo di Windows


17

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?



La risposta "accettata" in quel collegamento riguarda l'uso delle librerie di programmazione .NET per ottenere ciò per un file. Gli altri riguardavano l'aggiunta di un menu di scelta rapida per aggiornare singoli file. Stavo cercando un comando integrato per farlo ricorsivamente su N file. La risposta di seguito ha funzionato per farlo per tutti i file. Non è un built-in, ma funziona. Grazie.
jmq,

Non è nemmeno un duplicato della versione Windows del comando touch Unix , perché questa domanda richiede specificamente la ricorsione. Tuttavia, si noti che alcune risposte a questa domanda hanno forme ricorsive.
JdeBP,

Risposte:


19

Esistono diverse possibilità:

  • Utilizzare una porta di un touchcomando Unix e combinare semplicemente finde touchin 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 mve du, attraverso le shell Korn e C, aperle 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 touche 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 touchcomandi 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 findli avvolga. (Dopotutto, stanno prendendo di mira una base di utenti che sta cercando un touchcomando perché non ha un intero carico di comandi Unix portati.) Uno di questi è Stéphane Duguaytouch che come puoi vedere ha --recursiveun'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 COPYcomando (maggiori informazioni su cui è possibile trovare qui , per inciso). Questo ovviamente può essere combinato con FOR /Rper 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 /Sun'opzione al suo COPYcomando , il che significa che si potrebbe usare COPY /Scon la sintassi "più" per eliminare la necessità di un FORwrapper. Ma ciò rende davvero la vita inutilmente difficile per se stessi, considerando che TCC / LE ha un comando TOUCH integrato che supporta direttamente /Sun'opzione.


2
+1, COPY /B file+,,è la strada da percorrere, non richiede extra ... :-)
Tamara Wijsman

3
Il modo Powershell: (ls file).LastWriteTime = DateTime.now
Tamara Wijsman,

5

Dal momento che sono prontamente disponibili, consiglierei di sfruttare gli unxutils . Includono i comandi finde touchche lo renderanno molto semplice.

Dopo aver cambiato la directory più in alto che si desidera modificare:

trova . -type f -exec touch {} +

5

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)


3
-1 Come sono questi comandi copiano i file dalle sottocartelle alla radice e il risultato è un casino.
TonyG,

1
+1 Una piccola svolta per risolvere ciò che ha detto @TonyG: forfiles / S / C "cmd / c Copia / B nul: + ,,"
Alex Dupuis,

non cambia l'ultima modifica
beppe9000

4

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:

  • Installa l'applicazione
  • Vai alla directory in cui è necessario modificare i timestamp
  • Cerca * nella casella di ricerca in modo che l'esploratore mostri tutti i file
  • Quando vengono trovati tutti i file, selezionali tutti, fai clic destro su di essi e scegli Proprietà
  • Nella finestra di dialogo selezionare la scheda TimeStamps
  • Regola le date e gli orari secondo necessità e fai clic su Tocca

Ecco! Tutti i tuoi file sono stati aggiornati! Non è necessario alcun programma di utilità o riga di comando unix.


1

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 forcomando, assicurati di usare i segni del doppio percento per le tue variabili. (Es. %%iInvece di %i)


1

Anche su Windows 7 non è riuscito. Ho usato una sintassi diversa e l'ho fatta funzionare:

forfiles /c "cmd /c touch @file"

Nota, non ho usato l'opzione recurse.


1

Utilizzando PowerShell:

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date

Questo non funziona per me:The property 'LastWriteTime' cannot be found on this object.
Ben N

Ha funzionato per me in Windows Server 2012: (ls. \ Backup_db_20150810.sql) .LastWriteTime = Get-Date
ThiagoAlves,

0

In riferimento alla risposta di John T sopra:

Stavo cercando di capire la differenza tra la fine di un findcomando 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:\myfoldercontenente 2 file a.txteb.txt

  1. find . -type f -exec touch {} +viene interpretato come:
    touch a.txt b.txt
    Questo è simile al modo in cui xargs funziona

  2. mentre 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 execpuò avere un solo {}segnaposto).


Ottimo commento con buone informazioni, ma non una risposta alla domanda. Avrebbe fatto +1 se questo fosse un commento.
TonyG,

1
:) Non ricordo di aver pubblicato questo post :)
Ashutosh Jindal,

0

Utilizzo di PowerShell per la directory corrente e tutte le sottodirectory:

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

Oppure puoi specificare una cartella subito dopo dir.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.