Equivalente di Windows del comando 'touch' di Linux?


175

Cosa usi quando vuoi aggiornare il campo modificato in un file su Windows?

  1. comandi accessibili tramite C ++, .NET, C # o qualcosa di nativo di Windows (Vista preferibilmente)
  2. strumenti / applicazioni preferibilmente gratuiti e, se possibile, anche open source

Modifica: esiste già una pagina per le applicazioni, come sottolineato da CheapScotsman qui .

Se qualcuno sa come posso farlo tramite C ++, C #, WSH o qualcosa di simile, bene e bene, altrimenti penserei che tutto il resto sia coperto dalla domanda collegata.


Le quattro alternative sopra menzionate, più altre quattro non menzionate qui, si trovano nella risposta a una domanda simile: "Comando touch ricorsivo di Windows"
JdeBP,

stackoverflow.com/questions/210201/… menziona un carico, inclusoREM.>a
barlop

Risposte:


356

Se si desidera toccare l'indicatore della data di un file utilizzando Windows, utilizzare il comando seguente al prompt dei comandi:

copy /b filename.ext +,,

(dov'è filename.extil nome del tuo file). Il +,,è una bandiera speciale per copydicendogli semplicemente aggiornare la data / ora del file :

* Modifica dell'ora e della data di un file

Se si desidera assegnare l'ora e la data correnti a un file senza modificare il file, utilizzare la sintassi seguente:

copy /b Source+,,

Le virgole indicano l'omissione del parametro Destination.

Modifica in base ai commenti di Lumi e Justin: inseriscilo in un file batch, ad es. touch.cmd

@COPY /B %1+,, %1

Funziona anche se il file non si trova nella directory corrente (testato su Windows 7).


4
Questo sarà lento se i file sono di grandi dimensioni.
mob,

14
type touch.batis @echo offand next line copy /b %1 +,,- inseriscilo C:\bino cosa hai per i tuoi script, e poi puoi usarlo come touch myfile.txt.
Lumi,

17
In Win7 questo non funzionerà se non ci si trova nella cartella contenente il file. Creerà una copia nella directory di lavoro corrente.

6
Se è necessario eseguire questa operazione in una cartella remota (percorso UNC) - è necessario specificare anche la destinazione del comando copia - copy /b Source+,, Source- dove Sourceinclude il percorso completo del file
Giustino


162

Ho usato e raccomando unxutils che sono porte Win32 native di molte utility Unix comuni. C'è un touchcomando lì dentro.


6
Come quasi tutte le porte da Unix a Windows, questo non funziona con i caratteri Unicode nei nomi di file al di fuori del set di codifica come predefinito per i programmi non Unicode. Prova il nome del file che farà scattare tutti questi strumenti:"test тест τεστ.txt"
RomanSt

gnuwin32 ce l'ha. ma in effetti, anche gnuwin32 fallisce per i caratteri unicode.
barlop

1
Aggiornamento dal 2017 In Windows 10 possiamo usare il sottosistema Linux per Windows, che installa bash. Non sono necessarie cygwin, MinGW, unxutils o qualsiasi altra porta unix parziale per windows. docs.microsoft.com/en-us/windows/wsl/install-win10
Davos

@Davos l'hai provato su qualsiasi file diverso dal tuo contesto utente (di solito non privilegiato)? Perché tecnicamente il lato utente di LXSS è in esecuzione come utente non privilegiato.
0xC0000022L

@ 0xC0000022L non sono sicuro di cosa intendi nel contesto del touchcomando. È come qualsiasi altra cosa in ambienti NIX, puoi farlo o puoi farlo, o non puoi perché non hai i privilegi.
Davos,

96

Se tutto ciò che vuoi è cambiare la data dell'ultima modifica del file (che era il mio caso):

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

9
PowerShell FTW. Voglio dire, sul serio, unix è bello, ma PS è più bello.
matt

1
Puoi aggiornare l'ultima volta che scrivi anche per più file / cartelle

12
Funzionerà solo su un file. Per più file: ls * | ForEach-Object {$ _. LastWriteTime = Get-Date}
Eli Algranti

2
Se vuoi farlo in modo ricorsivo, funziona abbastanza bene: gci -recu -inc " . " | % {$ _. LastWriteTime = Get-Date}
BrainSlugs83

6
@ BrainSlugs83: usa i backtick `per il codice:gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date }
alldayremix

58
type nul >>file & copy file +,,
  • Crea filese non esiste.
  • Lascia solo il contenuto del file.
  • Utilizza solo i cmdbuilt-in.
  • Sia di ultimo accesso e la creazione di orari aggiornati.

AGGIORNARE

Gah! Questo non funziona su file di sola lettura, mentre touchfunziona. Suggerisco:

:touch
if not exist "%~1" type nul >>"%~1"& goto :eof
set _ATTRIBUTES=%~a1
if "%~a1"=="%_ATTRIBUTES:r=%" (copy "%~1"+,,) else attrib -r "%~1" & copy "%~1"+,, & attrib +r "%~1"

È un peccato che la copia non possa ignorare l'attributo + r come fa xcopy. Oppure, è un peccato che xcopy non supporti la strana filename +,,sintassi.
Abele,

Purtroppo questo non funziona (almeno non in Windows 7). Sembra che l'interprete dei comandi non aggiorni il timestamp della destinazione di un reindirizzamento se il file non viene effettivamente modificato (ovvero, non ci sono dati da reindirizzare).
Synetech,

32

@ Dash-tom-bang:

Ecco la spiegazione di Technet del misterioso "+" e delle virgole:

copia / b Fonte + ,,

Le virgole indicano l'omissione del parametro Destination.

Il comando copia supporta l'unione di più file in un singolo file di destinazione. Poiché non è possibile specificare una destinazione vuota utilizzando un carattere spazio al prompt dei comandi, è possibile utilizzare due virgole per indicarlo.

E questo è il riferimento al comando di copia di Technet: http://technet.microsoft.com/en-us/library/bb490886.aspx


16
Questa è solo una sintassi incasinata. Davvero, a cosa stavano pensando? Nota anche che la stessa documentazione dice "Destinazione: Obbligatorio" ... Sono stupito.
qc

1
Questo non sembra funzionare nemmeno in Vista ... Mi chiedo se sono tornati in sé?
Quillbreaker

1
Funziona con Windows 7
Imran,

5
Ha funzionato per me anche senza virgole: copia file.ext + Quindi la documentazione è tanto lontana dal comportamento reale quanto il comportamento è da ogni ragionevole aspettativa.
Abgan,

2
Ha funzionato in Windows Server 2008 ma solo se ti trovi nella cartella contenente il file
FrinkTheBrave,


21

ecco una versione ricorsiva che usa powershell ... questo cambierà l'ultima volta modificata per tutti i file e le sottodirectory e i file all'interno delle sottodirectory di questa directory

ps c:myDir> Get-ChildItem . * -recurse | ForEach-Object{$_.LastWriteTime = get-date}

2
Meno prolisso ma usando solo le brevi abbreviazioni Powershell standard:ls * -recurse | % { $_.LastWriteTime = Get-Date }
Jonas

15

Il progetto GnuWin32 ha porte Windows delle versioni Gnu delle utility della riga di comando Unix.

Viene fornito come un numero di pacchetti separati ed è possibile installare solo i comandi necessari senza altre dipendenze. Per touchte sarebbe necessario il pacchetto CoreUtils .


15

cygwinviene con touch. So che hai detto che non vuoi installare un intero framework, ma cygwin è abbastanza leggero e può essere chiamato dalla finestra di comando dos senza l'intera riga di comando simile a unix attivata.

Puoi anche controllare quali strumenti installare, in modo da poter semplicemente installare il touch.exefile e lasciare il resto del framework.


2
A questo punto, tutto ciò che serve per installare è il file touch.exe e cygwin.dll in una directory per utilizzare lo strumento. Non ci sono altre dipendenze relative all'uso degli strumenti basati su Cygwin.
Tall Jeff,

1
quando provo questo (win7x64) ho bisogno di 4 cygwin dll oltre a touch.exe: cygiconv-2.dll cygintl-8.dll cygwin1.dll cyggcc_s-1.dll
matt wilkie

15

Ho provato questo per creare un file vuoto nel mio script batch. Puoi usare questo:

ECHO text>file1.txt

3
Questo è di gran lunga il miglior metodo rapido .. Avevo solo bisogno di creare un file .gitignore, e Windows 7 continua a lamentarsi "deve inserire un nome file" ecc ecc. Ha echo pie>.gitignorefunzionato a meraviglia - grazie!

4
@Alex Non è correlato, ma l'errore di Windows è dovuto al fatto che il file inizia con un punto. C'è uno strano trucco per aggirare quello in Esplora risorse: fai finire il file anche con un punto. Quindi digitare .gitignore.e quando si preme Invio, Windows rimuove il periodo finale. Pazzo, ma funziona.
Brad Cupit,

1
Vorrei poter esprimere abbastanza voti da catturare la popolarità dei grandi giocatori.
Jonathan Mee,

1
Questo però non crea un file vuoto, file1.txt ha "testo" al suo interno.
Joshua Meyers,

14

Ecco un semplice regfile che ho scritto per aggiungere il tasto destro "tocco" in Windows Explorer . Sarebbe facile anche scriverlo, dal momento che chiama solo:

cmd.exe /c copy %1+nul %1 /by

E non dimenticare copy nul some_filedi creare un file vuoto (che è quello che vedo touchpiù spesso usato per).
Joey,

Ack! File zip inaccessibile (qualcosa su brinkster22.com che deve essere il sito di riferimento). Jon, puoi aggiornarlo?
Dan7119,

Funziona su Win7. Non funziona su WinXP: il tempo del file rimane lo stesso dopo aver eseguito "copia".
Egor Skriptunoff,


11

Prova questo da CodeProject .

  • Non è necessario installare.
  • Se vuoi, puoi anche modificare la fonte.

2
Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia.
Yan Sklyarenko,

9

Puoi anche installare Cygwin che ti dà Touch e una pletora di altri comandi * NIX.


2
non può vivere su Windows senza Cygwin.
jweede,

E Cygwin senza la menta è piuttosto zoppo.
Ahe,


5

Da una domanda simile su Stack Overflow.

Per aggiornare i timestamp (ignorando le altre funzionalità di touch), sceglierei:

copy /b filename.ext +,,

1
Questa è una ripetizione della risposta di Gish Domains da 2 anni prima, senza la spiegazione.
fixer1234,


4

dal sito web:

Funduc Software Touch è un'utilità 'touch' gratuita che consente di modificare l'ora / la data e / o gli attributi su uno o più file. Inoltre, FS Touch può aggiungere / sottrarre un numero specificato di secondi dall'ora del file esistente. È possibile specificare quali file e / o sottodirectory modificare tramite "maschere file complesse". Il programma può essere eseguito in modo interattivo o dalla riga di comando. La nuova versione 7.2 è un'opzione della riga di comando per modificare il timestamp modificato del file +/- il numero di secondi specificato.

FS Touch funziona su Windows XP, Vista, Windows 7 e Windows 8.


4

Questo contenuto può essere salvato in un file reg. Ciò aggiungerà un menu contestuale del tasto destro per tutti i file con l'abilità "Touch File" (testato su Windows 7). Copia tutte le seguenti righe nel file reg. Esegui il file e approva la domanda. Fare clic con il tasto destro su qualsiasi file (o più file) - L'opzione "Touch File" è ora disponibile.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell]

[HKEY_CLASSES_ROOT\*\shell\Touch File]

[HKEY_CLASSES_ROOT\*\shell\Touch File\command]
@="cmd /C copy /b \"%1\" +,,"

3

Se stai usando git per uno o più progetti, il mingw basato git-bashsu Windows ha il touchcomando. Voglio ringraziare @ greg-hewgill per avermi fatto notare che 'nix utility esistono per Windows, perché è stato quello che mi ha fatto venire l'idea di provare a toccare in git-bash.


3

in PowerShell provare:

ni fileName.txt

NIè un alias del cmdlet New-Item .


1
Benvenuto in SuperUser. Grazie per la pubblicazione! È possibile aggiungere un collegamento a un sito Web che fornisce ulteriori informazioni sul nicomando e forse descrivere più cosa fa il comando?
hBy2Py

1
Il New-Itemcmdlet non può essere utilizzato per aggiornare il timestamp di un file esistente.
Twisty Impersonator,

Sebbene non aggiorni il timestamp, crea un nuovo file, che è il tocco. +1 da me.
MikeMurko,

2

Salvare quanto segue come touch.bat nella cartella% windir% \ system32 o aggiungere la cartella in cui è stato salvato nella variabile di ambiente PATH:

@echo off
if %1.==. goto end
if not exist %1 goto end
copy /b %1 +,, > nul
echo %1 touched!
:end

Esempio di utilizzo:

touch *.cpp
touch somefile.c

Riferimento: Microsoft KB 69581


Eccellente! Nessun materiale esterno, basta copiare. E ovviamente la maggior parte di noi ne ha bisogno come uno stript batch :)
Bogdan Gavril MSFT,

2

Ho trovato un modo rapido per farlo se hai installato vim (non eccezionale per file di grandi dimensioni, aprirà l'intero file e poi lo chiuderà ...)

vim foobar.txt +wq!

"+" Imposta l'argomento per eseguire i seguenti comandi. "WQ!" è "scrivi, esci, forza". Questo aprirà il file, eseguirà un salvataggio, quindi lo chiuderà immediatamente dopo.


Inutilmente complesso, ingombrante e non portatile. -1
MD XF,

2

Volevo la funzione 'touch' di clonare / duplicare le date dei file da un altro file, nativamente, ed essere utilizzabile da un file batch.

Quindi 'trascina e rilascia' il file video sul file batch, viene eseguito FFMPEG, quindi 'Data di creazione' e 'Data di modifica' dal file di input vengono copiati nel file di output.

Inizialmente è sembrato semplice fino a quando i file batch non sono terribili nella gestione dei nomi di file unicode, in PowerShell in linea si confonde con i simboli dei nomi dei file e la doppia evasione è un incubo.

La mia soluzione era rendere la parte 'touch' uno script PowerShell separato che ho chiamato 'CLONE-FILE-DATE.ps1' e contiene:

param
(
  [Parameter(Mandatory=$true)][string]$SourcePath,
  [Parameter(Mandatory=$true)][string]$TargetPath
)

(GI -LiteralPath $TargetPath).CreationTime  = (GI -LiteralPath $SourcePath).CreationTime
(GI -LiteralPath $TargetPath).LastWriteTime = (GI -LiteralPath $SourcePath).LastWriteTime

Quindi ecco un esempio di utilizzo all'interno del mio file batch "CONVERT.BAT":

%~dp0\ffmpeg -i "%~1" ACTION "%~1-output.mp4"

CHCP 65001 > nul && PowerShell -ExecutionPolicy ByPass -File "%~dp0\CLONE-FILE-DATE.PS1" "%~1" "%~1-output.mp4"

Penso che PowerShell sia leggibile, quindi spiegherò semplicemente il batch parla:

% ~ dp0 è la directory corrente del file batch.

% ~ 1 è il percorso del file rilasciato nel batch senza virgolette.

CHCP 65001> nul imposta i caratteri su UTF-8 e ingoia l'output.

-ExecutionPolicy ByPass consente di eseguire PowerShell senza dover modificare la politica globale, che è lì per impedire alle persone di eseguire accidentalmente script.


1

Provare

file fsutil createnew new.txt 0


2
The FSUTIL utility requires that you have administrative privileges.- e non si comporta come touchper i file esistenti.
Keith Thompson,

1

Le cinque alternative sopra menzionate, più altre tre non menzionate qui, sono disponibili su SuperUser: "Comando touch ricorsivo di Windows"


2
Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia.
Yan Sklyarenko,


1

Bene, se vuoi davvero avere il touchcomando disponibile, puoi metterlo in un file batch chiamato touch.bate incollarlo in C:\Windows:

TYPE NUL >>%1

Abbastanza semplice.


Questo metodo NON aggiorna l'ora modificata sulle seguenti piattaforme: Windows Server 2012 R2, Windows Server 2016, Windows 10
Nate

0

Le persone di Unix hanno risolto il problema generale dell'aggiornamento della data del file di qualsiasi file con il comando touch . Tuttavia, per Windows, a volte è possibile un metodo più semplice per casi speciali.

Devo aggiornare il timestamp di un collegamento di un'applicazione in Windows 8.1 per rendere visibili le modifiche al colore di sfondo del riquadro dell'applicazione, vedere questa domanda SO . Invece di implementare uno degli strumenti intelligenti sopra, trovo più facile modificare il campo dei commenti del collegamento. La maggior parte delle persone lascia questo vuoto, ma ovviamente viene rapidamente concepito un commento utile. E se esiste un commento, aggiungere o rimuovere un periodo finale non fa mai male.


0

Apprezzo che questa sia una vecchia domanda, ho appena scoperto il tocco sul mio sistema Windows 10. Ho scaricato e installato Git da qui (penso) e sembra che il tocco e varie altre utilità siano nella cartella bin.

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.