Pregunta ¿Windows equivalente al comando de Linux 'touch'?


¿Qué usas cuando quieres actualizar el campo de fecha modificado de un archivo en Windows?

  1. comandos accesible a través de C ++, .NET, C #, o algo nativo de Windows (Vista preferiblemente)
  2. herramientas / aplicaciones preferiblemente libre, y si es posible fuente abierta también

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

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


151


origen


Las cuatro alternativas mencionadas anteriormente, más cuatro más que no se mencionan aquí, se pueden encontrar en la respuesta a una pregunta similar: "Comando táctil de Windows Recursive" - JdeBP
stackoverflow.com/questions/210201/...    menciona una carga, incluyendo REM.>a - barlop


Respuestas:


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

(dónde filename.ext es el nombre de su archivo). los +,, es una bandera especial para copy diciéndole simplemente actualizar la fecha / hora en el archivo:

* Cambiar la hora y la fecha de un archivo

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

copy /b Source+,,

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

Edición basada en los comentarios de Lumi y Justin: poner esto en un archivo por lotes, ej. touch.cmd

@COPY /B %1+,, %1

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


333



¿Qué está haciendo esto? ¿Dónde está documentado? (Google no puede indexar "+ ,,", y el sitio de MS no me está llevando en la dirección correcta, ya que buscar en 'copia' no aporta mucha utilidad.) Quiero decir, funciona muy bien y lo tomaré muy por supuesto, pero tengo curiosidad. - dash-tom-bang
Documentación para copy: technet.microsoft.com/en-us/library/bb490886.aspx - Joseph Hansen
type touch.bat es @echo off y siguiente línea copy /b %1 +,, - ponerlo en C:\bin o qué tienes para tus propios scripts, y luego puedes usarlo como touch myfile.txt. - Lumi
En Win7, esto no funcionará si no está en la carpeta que contiene el archivo. Creará una copia en el directorio de trabajo actual.
Si necesita hacer esto en una carpeta remota (ruta UNC), también debe especificar el destino para el comando de copia: copy /b Source+,, Source - dónde Source incluye la ruta completa al archivo - Justin


He usado y recomendado unxutils que son puertos Win32 nativos de muchas utilidades comunes de Unix. Hay un touch comando allí.


160



Como casi todos los puertos de Unix a Windows, esto no funciona con los caracteres Unicode en los nombres de archivo fuera del conjunto de codificación como el predeterminado para los programas que no son Unicode. Nombre del archivo de prueba que hará que cada herramienta se dispare: "test тест τεστ.txt" - RomanSt
gnuwin32 lo tiene. pero, de hecho, gnuwin32 también falla para los caracteres Unicode. - barlop
Actualización a partir 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 a los puertos de Windows. docs.microsoft.com/en-us/windows/wsl/install-win10 - Davos


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

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

90



PowerShell FTW. Quiero decir, en serio, Unix es genial, pero PS es más genial. - matt
Puede actualizar la última vez que escribe para varios archivos / carpetas también
Esto funcionará solo en un archivo. Para archivos múltiples: ls * | ForEach-Object {$ _. LastWriteTime = Get-Date} - Eli Algranti
Si quieres hacerlo recursivamente, esto funciona bastante bien: gci -recu -inc "."|% {$ _. LastWriteTime = Get-Date} - BrainSlugs83
@ BrainSlugs83: use backticks `para el código: gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date } - alldayremix


type nul >>file & copy file +,,
  • Crea file si no existe
  • Deja el contenido del archivo solo.
  • Solo usa cmd incorporados.
  • Ambos ultimo acceso y creación tiempos actualizados

ACTUALIZAR

Gah! Esto no funciona en archivos de solo lectura, mientras que touch hace. 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"

51



Es una pena que Copy no pueda ignorar el atributo + r de la misma forma que lo hace xcopy. O es una lástima que xcopy no admita lo raro filename +,, sintaxis. - 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 ha modificado realmente (es decir, no hay datos para redirigir). - Synetech


@ dash-tom-bang:

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

copy / b Fuente + ,,

Las comas indican la omisión de   el parámetro Destino

El comando de copia admite la fusión de varios archivos en un solo archivo de destino. Como un destino en blanco no se puede especificar utilizando un carácter de espacio en el símbolo del sistema, se pueden usar dos comas para denotarlo.

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


32



Ahora solo es una sintaxis desordenada. Seriamente, ¿que estaban pensando? También tenga en cuenta que la misma documentación dice "Destino: Obligatorio." ... Estoy sorprendido. - sth
Esto no parece funcionar en Vista ... Me pregunto si volvieron a sus cabales. - quillbreaker
Funciona en Windows 7 - Imran
Me funcionó incluso sin comas: copy file.ext + Entonces, la documentación está tan alejada del comportamiento real como el comportamiento de cualquier expectativa razonable. - Abgan
Funcionó en Windows Server 2008 pero solo si estás en la carpeta que contiene el archivo - FrinkTheBrave


Si desea codificarlo usted mismo, .NET ofrece File.SetLastAccessTime, File.SetCreationTime y File.SetLastWriteTime métodos.


22





aquí hay una versión recursiva usando 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}

21



Menos detallado pero aún usando solo shorthands Powershell estándar: ls * -recurse | % { $_.LastWriteTime = Get-Date } - Jonas