¿El equivalente de Windows del comando de Linux 'touch'?

175

¿Qué utiliza cuando desea actualizar el campo de fecha modificada de un archivo en Windows?

  1. comandos accesibles a través de C ++, .NET, C # o algo nativo de Windows (preferiblemente Vista)
  2. herramientas / aplicaciones preferiblemente gratuitas, y si es posible también de código abierto

Editar: ya hay una página para aplicaciones como señala CheapScotsman aquí .

Si alguien sabe cómo puedo hacer esto a través de C ++, C #, WSH o algo similar, bueno y bueno, de lo contrario, creo que todo lo demás está cubierto en la pregunta vinculada.

facepalmd
fuente
Las cuatro alternativas mencionadas anteriormente, más otras cuatro no mencionadas aquí, se pueden encontrar en la respuesta a una pregunta similar: "Comando táctil recursivo de Windows"
JdeBP
stackoverflow.com/questions/210201/… menciona una carga, incluyendoREM.>a
barlop

Respuestas:

356

Si desea tocar el sello de fecha de un archivo usando Windows, use el siguiente comando en el símbolo del sistema:

copy /b filename.ext +,,

(donde filename.extestá el nombre de su archivo). El +,,es un indicador especial para copydecirle que simplemente actualice la fecha / hora en el archivo :

* Cambiar la hora y la fecha de un archivo

Si desea asignar la hora y fecha actuales a un archivo sin modificar el archivo, use la siguiente sintaxis:

copy /b Source+,,

Las comas indican la omisión del parámetro Destino.

Editar basado en los comentarios de Lumi y Justin: poner esto en un archivo por lotes, por ejemplo. touch.cmd

@COPY /B %1+,, %1

Esto funciona incluso si el archivo no está en el directorio actual (probado en Windows 7).

EM0
fuente
44
Esto será lento si los archivos son grandes.
mafia
14
type touch.batis @echo offand next line copy /b %1 +,,: póngalo en C:\bino lo que tenga para sus propios scripts, y luego puede usarlo como touch myfile.txt.
Lumi
17
En Win7, esto no funcionará si no está en la carpeta que contiene el archivo. Creará una copia en el directorio de trabajo actual.
66
Si necesita hacer esto en una carpeta remota (ruta UNC) - también debe especificar el destino del comando de copia copy /b Source+,, Source- donde Sourceincluye la ruta completa al archivo
Justin
162

He usado y recomiendo unxutils que son puertos nativos de Win32 de muchas utilidades comunes de Unix. Hay un touchcomando allí.

Greg Hewgill
fuente
66
Como casi todos los puertos de Unix a Windows, esto no funciona con caracteres Unicode en los nombres de archivo fuera del conjunto de codificación como el predeterminado para los programas no Unicode. Pruebe el nombre de archivo que activará cada una de estas herramientas:"test тест τεστ.txt"
RomanSt
gnuwin32 lo tiene. pero de hecho, gnuwin32 también falla para los caracteres unicode.
barlop
1
Actualización de 2017 En Windows 10 podemos usar el subsistema Linux para Windows, que instala bash. No hay necesidad de cygwin, MinGW, unxutils o cualquier otro unix parcial para los puertos de Windows. docs.microsoft.com/en-us/windows/wsl/install-win10
Davos
@Davos, ¿lo ha intentado en otro archivo que no sea su contexto de usuario (generalmente no privilegiado)? Porque técnicamente el lado del usuario de LXSS se está ejecutando como usuario sin privilegios.
0xC0000022L
@ 0xC0000022L no estoy seguro de lo que quiere decir en el contexto del touchcomando. Es como cualquier otra cosa en entornos nix, puedes hacerlo o puedes sudarlo, o no puedes porque no tienes privilegios.
Davos
96

Si todo lo que desea es cambiar la última fecha de modificación del archivo (que fue mi caso):

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date
ThiagoAlves
fuente
99
PowerShell FTW. Quiero decir, en serio, Unix es genial, pero PS es más genial.
mate
1
También puede actualizar la última vez que escribe para múltiples archivos / carpetas
12
Esto funcionará solo en un archivo. Para múltiples archivos: ls * | ForEach-Object {$ _. LastWriteTime = Get-Date}
Eli Algranti
2
Si desea hacerlo de forma recursiva, esto funciona bastante bien: gci -recu -inc " . " | % {$ _. LastWriteTime = Get-Date}
BrainSlugs83
66
@ BrainSlugs83: use las teclas de retroceso `para el código:gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date }
alldayremix
58
type nul >>file & copy file +,,
  • Crea filesi no existe.
  • Deja el contenido del archivo solo.
  • Solo usa cmdincorporados.
  • Se actualizaron los tiempos de último acceso y creación .

ACTUALIZAR

Gah! Esto no funciona en archivos de solo lectura, mientras que touchsí. Yo sugiero:

: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"
bobbogo
fuente
Es una pena que la copia no pueda ignorar el atributo + r como lo hace xcopy. O, es una pena que xcopy no sea compatible con la filename +,,sintaxis extraña .
Abel
Lamentablemente, esto no funciona (al menos no en Windows 7). Parece que el intérprete de comandos no actualiza la marca de tiempo del destino de una redirección si el archivo no se modifica realmente (es decir, no hay datos para redirigir).
Synetech
32

@ dash-tom-bang:

Aquí está la explicación de Technet del misterioso '+' y comas:

copia / b Fuente + ,,

Las comas indican la omisión del parámetro Destino.

El comando copiar admite la fusión de varios archivos en un solo archivo de destino. Dado que no se puede especificar un destino en blanco usando un carácter de espacio en el símbolo del sistema, se pueden usar dos comas para denotar eso.

Y esta es la referencia de comando de copia de Technet: http://technet.microsoft.com/en-us/library/bb490886.aspx

Faredoon
fuente
16
Ahora eso es una sintaxis desordenada. En serio, ¿qué estaban pensando? También tenga en cuenta que la misma documentación dice "Destino: obligatorio" ... Estoy asombrado.
sth
1
Esto ni siquiera parece funcionar en Vista ... Me pregunto si volvieron en sí.
Quillbreaker
1
Funciona en Windows 7
Imran, el
55
Funcionó para mí incluso sin comas: copy file.ext + Por lo tanto, la documentación está tan lejos del comportamiento real como el comportamiento de cualquier expectativa razonable.
Abgan
2
Funcionó en Windows Server 2008, pero solo si está en la carpeta que contiene el archivo
FrinkTheBrave
21

aquí hay una versión recursiva que usa powershell ... esto cambiará la última hora de modificación para todos los archivos y subdirectorios, y los archivos dentro de los subdirectorios de este directorio

ps c:myDir> Get-ChildItem . * -recurse | ForEach-Object{$_.LastWriteTime = get-date}
Roger
fuente
2
Menos detallado pero utilizando solo shorthands estándar de Powershell:ls * -recurse | % { $_.LastWriteTime = Get-Date }
Jonas
15

El proyecto GnuWin32 tiene puertos de Windows de las versiones Gnu de las utilidades de línea de comandos de Unix.

Viene como una serie de paquetes separados y puede instalar solo los comandos que necesita sin otras dependencias. Para touchusted necesitaría el paquete CoreUtils .

Dave Webb
fuente
15

cygwinviene con touch. Sé que mencionó que no desea instalar un marco completo, pero cygwin es bastante liviano y se puede llamar desde la ventana de comandos de DOS sin que se active toda la línea de comandos tipo Unix.

También puede controlar qué herramientas instalar, por lo que simplemente puede instalar el touch.exearchivo y dejar el resto del marco.

serg10
fuente
2
Para su punto aquí, todo lo que necesita instalar es el archivo touch.exe y cygwin.dll en un directorio para usar la herramienta. No hay otras dependencias en relación con el uso de herramientas basadas en Cygwin.
Alto Jeff
1
cuando intento esto (win7x64) necesito 4 cygwin dll además de touch.exe: cygiconv-2.dll cygintl-8.dll cygwin1.dll cyggcc_s-1.dll
matt wilkie
15

Intenté esto para crear un archivo vacío en mi script por lotes. Puedes usar esto:

ECHO text>file1.txt
pkm
fuente
3
Este es, por lejos, el mejor método rápido. Solo necesitaba crear un archivo .gitignore, y Windows 7 sigue quejándose "debe ingresar un nombre de archivo", etc., etc. echo pie>.gitignorefuncionó de maravilla. ¡Gracias!
44
@Alex Esto no está relacionado, pero ese error de Windows se debe a que el archivo comienza con un punto. Hay un truco extraño para evitarlo en el Explorador de Windows: haga que el archivo finalice con un punto también. Por lo tanto, escriba .gitignore.y cuando presiona enter Windows elimina el período final. Loco, pero funciona.
Brad Cupit
1
Desearía poder dar suficientes votos a favor para que atraiga a los grandes jugadores en popularidad.
Jonathan Mee
1
Sin embargo, esto no crea un archivo vacío, file1.txt tiene "texto".
Joshua Meyers
14

Aquí hay un simple archivo de registro que escribí para agregar "clic" con el botón derecho en el explorador de Windows . También sería fácil escribirlo, ya que solo llama:

cmd.exe /c copy %1+nul %1 /by
Jon Galloway
fuente
Y no te olvides copy nul some_filede crear un archivo vacío (que es lo que veo touchmás utilizado).
Joey
Ack! Archivo Zip inaccesible (algo sobre brinkster22.com que necesita ser el sitio de referencia). Jon, ¿puedes actualizar esto?
Dan7119
Funciona en Win7. No funciona en WinXP: el tiempo de archivo sigue siendo el mismo después de ejecutar "copiar".
Egor Skriptunoff
11

Pruebe este de CodeProject .

  • No es necesario instalarlo.
  • Si lo desea, incluso puede modificar la fuente.
Prakash
fuente
2
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia.
Yan Sklyarenko
9

También puede instalar Cygwin, que le ofrece Touch, así como una gran cantidad de otros comandos * NIX.

jamesaharvey
fuente
2
No puedo vivir en Windows sin Cygwin.
jweede
Y Cygwin sin mintty es bastante cojo.
Ahe
5

Hay puertos de Windows de muchas utilidades de Unix. Echa un vistazo a los proyectos unxutils o GnuWin32 .

VladV
fuente
5

De una pregunta similar sobre Stack Overflow.

Para actualizar las marcas de tiempo (ignorando la otra funcionalidad de touch), iría con:

copy /b filename.ext +,,
Dennis Williamson
fuente
1
Esta es una repetición de la respuesta de Gish Domains de 2 años antes, sin la explicación.
Fixer1234
4

del sitio web:

Funduc Software Touch es una utilidad 'táctil' gratuita que le permite cambiar la hora / fecha y / o sellos de atributos en uno o más archivos. Además, FS Touch puede sumar / restar un número específico de segundos del tiempo de archivo existente. Puede especificar qué archivo (s) y / o subdirectorios cambiar mediante 'máscaras de archivos complejos'. El programa se puede ejecutar de forma interactiva o desde la línea de comandos. Nuevo en la versión 7.2 es un cambio de línea de comando para cambiar la marca de tiempo modificada del archivo +/- el número de segundos especificado.

FS Touch se ejecuta en Windows XP, Vista, Windows 7 y Windows 8.


fuente
4

Este contenido se puede guardar en un archivo de registro. Esto agregará un menú contextual de clic derecho para todos los archivos con la capacidad "Touch File" (probado en Windows 7). Copie todas las siguientes líneas al archivo de registro. Ejecute el archivo y apruebe la pregunta. Haga clic derecho en cualquier archivo (o en varios archivos): la opción "Touch File" ahora está disponible.

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\" +,,"

fuente
3

Si está utilizando git para uno o más proyectos, el mingw basado git-bashen Windows tiene el touchcomando. Quiero agradecer a @ greg-hewgill por señalarme que existen 'utilidades nix para Windows, porque fue eso lo que me propuso intentar tocar en git-bash.

Superole
fuente
3

en PowerShell intente:

ni fileName.txt

NIes un alias del cmdlet New-Item .

Twisty
fuente
1
Bienvenido a SuperUser. ¡Gracias por publicar! ¿Puede agregar un enlace a un sitio web que proporcione más información sobre el nicomando y quizás describa más lo que hace el comando?
hBy2Py
1
El New-Itemcmdlet no se puede usar para actualizar la marca de tiempo de un archivo existente.
Twisty Impersonator
Si bien no actualiza la marca de tiempo, crea un nuevo archivo, que es lo que hace el tacto. +1 de mi parte
MikeMurko
2

Guarde lo siguiente como touch.bat en su carpeta% windir% \ system32 o agregue la carpeta en la que está guardada en su variable de entorno PATH:

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

Uso de la muestra:

touch *.cpp
touch somefile.c

Referencia: Microsoft KB 69581

Tim Perdiz
fuente
¡Excelente! No hay cosas externas, solo copie. Y, por supuesto, la mayoría de nosotros lo necesitamos como un striptease por lotes :)
Bogdan Gavril MSFT
2

Encontré una forma rápida de hacerlo si tiene vim instalado (no es bueno para archivos grandes, abrirá todo el archivo y luego lo cerrará ...)

vim foobar.txt +wq!

El "+" establece el argumento para ejecutar los siguientes comandos. "wq!" es "escribir, salir, forzar". Esto abrirá el archivo, lo guardará y luego lo cerrará inmediatamente después.

Jason
fuente
Inútilmente complejo, voluminoso y no portátil. -1
MD XF
2

Quería la función 'táctil' de clonar / duplicar las fechas de archivo de otro archivo, de forma nativa, y ser utilizable desde un archivo por lotes.

Entonces, 'arrastre y suelte' el archivo de video en un archivo por lotes, FFMPEG se ejecuta, luego 'Fecha de creación' y 'Fecha de modificación' del archivo de entrada se copia en el archivo de salida.

Esto pareció simple al principio hasta que descubrió que los archivos por lotes son terribles para manejar nombres de archivo Unicode, PowerShell en línea se equivoca con los símbolos de nombre de archivo, y el doble escape es una pesadilla.

Mi solución fue hacer que la parte 'táctil' fuera un script separado de PowerShell que llamé 'CLONE-FILE-DATE.ps1' y que 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

Entonces, aquí hay un ejemplo de uso dentro de mi archivo por lotes '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"

Creo que PowerShell es legible, por lo que solo explicaré el discurso por lotes:

% ~ dp0 es el directorio actual del archivo por lotes.

% ~ 1 es la ruta del archivo soltado en el lote sin comillas.

CHCP 65001> nul establece caracteres en UTF-8 y se traga la salida.

-ExecutionPolicy ByPass le permite ejecutar PowerShell sin necesidad de modificar la política global, que está allí para evitar que las personas ejecuten scripts accidentalmente.

WhoIsRich
fuente
1

Tratar

fsutil file createnew new.txt 0


fuente
2
The FSUTIL utility requires that you have administrative privileges.- y no se comporta como touchpara los archivos existentes.
Keith Thompson
1

Las cinco alternativas mencionadas anteriormente, más tres más no mencionadas aquí, se pueden encontrar en SuperUser: "Comando táctil recursivo de Windows"

JdeBP
fuente
2
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia.
Yan Sklyarenko
1

Bueno, si realmente quieres tener el touchcomando disponible, puedes ponerlo en un archivo por lotes llamado touch.baty pegarlo en C:\Windows:

TYPE NUL >>%1

Suficientemente simple.

MD XF
fuente
Este método NO actualiza el tiempo modificado en las siguientes plataformas: Windows Server 2012 R2, Windows Server 2016, Windows 10
Nate
0

La gente de Unix solucionó el problema general de actualizar la fecha del archivo de cualquier archivo con el comando táctil . Sin embargo, para Windows, a veces es posible un método más simple para casos especiales.

Necesito actualizar la marca de tiempo de un acceso directo de la aplicación en Windows 8.1 para poder ver los cambios en el color de fondo del mosaico de la aplicación, vea esta pregunta de SO . En lugar de implementar una de las herramientas inteligentes anteriores, me resulta más fácil editar el campo de comentarios del acceso directo. La mayoría de la gente deja esto vacío, pero, por supuesto, se concibe rápidamente un comentario útil. Y si existe un comentario, agregar o eliminar un período final nunca hace daño.

Roland
fuente
0

Aprecio que esta es una vieja pregunta, acabo de descubrir el tacto en mi sistema Windows 10. Descargué e instalé Git desde aquí (creo) y parece táctil y varias otras utilidades están en la carpeta bin.

0909EM
fuente