En Windows 7, ¿cómo puedo tocar recursivamente todos los archivos en un directorio (incluidos los subdirectorios) para actualizar la marca de fecha / hora?
¿Windows 7 tiene un mecanismo para lograr esto?
En Windows 7, ¿cómo puedo tocar recursivamente todos los archivos en un directorio (incluidos los subdirectorios) para actualizar la marca de fecha / hora?
¿Windows 7 tiene un mecanismo para lograr esto?
Respuestas:
Hay varias posibilidades:
Use un puerto de un touch
comando Unix y simplemente combine find
y touch
de la manera Unix. Hay varias opciones Los mencionados anteriormente son GNUWin32 , cygwin y unxutils . Menos conocidas, pero de alguna manera mejores, son las herramientas en el kit de herramientas de utilidad SFUA , que se ejecutan en el Subsistema para aplicaciones basadas en UNIX que viene en la caja con Windows 7 Ultimate Edition y Windows Server 2008 R2. (Para Windows XP, uno puede descargar e instalar Servicios para UNIX versión 3.5 .) Este kit de herramientas tiene una gran cantidad de herramientas TUI de línea de comandos, desde mv
y du
, a través de los shells Korn y C, hastaperl
y awk
. Viene en sabores x86-64 e IA64, así como en x86-32. Los programas se ejecutan en el entorno POSIX apropiado nativo de Windows, en lugar de con archivos DLL de emulador (como cygwin1.dll
) superponer cosas sobre Win32. Y sí, el kit de herramientas tiene touch
y find
, además de unos 300 más.
Todos estos juegos de herramientas tienen la conocida desventaja de ejecutar un proceso separado para cada archivo que se toque, por supuesto. Eso no es un problema con las siguientes alternativas.
Utilice uno de los muchos touch
comandos nativos de Win32 que la gente ha escrito y publicado. Muchos de ellos admiten opciones para realizar la recursividad, sin la necesidad de que Unix los find
envuelva. (Después de todo, están apuntando a una base de usuarios que está buscando un touch
comando porque no tiene una carga completa de comandos Unix portados). Uno de ellos es Stéphane Duguay,touch
que como puede ver tiene una --recursive
opción.
Sé inteligente con los misterios arcanos de CMD. Como se menciona en la otra respuesta, COPY /B myfile+,,
actualizará la fecha de la última modificación de un archivo, utilizando la sintaxis "más" poco conocida del COPY
comando (más información sobre la cual se puede encontrar aquí , por cierto). Esto, por supuesto, se puede combinar FOR /R
para realizar la operación de forma recursiva, como se sugiere en otra respuesta aquí.
Use un intérprete de comandos de reemplazo y sea menos inteligente y más directo que CMD. JP Software TCC / LE es uno de esos. Agrega una /S
opción a su COPY
comando , lo que significa que se podría usar COPY /S
con la sintaxis "plus" para eliminar la necesidad de un FOR
contenedor. Pero eso realmente todavía hace la vida innecesariamente difícil para uno mismo, teniendo en cuenta que TCC / LE tiene un comando TOUCH incorporado que admite directamente una /S
opción.
COPY /B file+,,
es el camino a seguir, no requiere extras ... :-)
(ls file).LastWriteTime = DateTime.now
Para usar solo la funcionalidad de Windows existente (nada extra para instalar) intente uno de estos:
forfiles /P C:\Path\To\Root /S /C "cmd /c Copy /B @path+,,"
("tocar" recursivamente todos los archivos que comienzan en la ruta especificada)
O
forfiles /S /C "cmd /c Copy /B @path+,,"
("tocar" recursivamente todos los archivos que comienzan en el directorio actual)
Sé que esto probablemente sea demasiado tarde, pero no obstante, dejaré mi respuesta en caso de que alguien más necesite lo mismo.
La respuesta de John T no funcionó para mí en Windows 7. Después de investigar, encontré esta utilidad llamada SKTimeStamp , que hace el trabajo perfectamente.
Aquí hay un artículo con más detalles sobre cómo funciona: http://www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and -accedido / .
Estos son los pasos que debe realizar:
Voila! ¡Todos tus archivos han sido actualizados! No se necesitan utilidades ni líneas de comando de Unix.
O podría usar las herramientas ya integradas en Windows, una vez que ya tenga una herramienta "táctil" de algún tipo:
for /r %i in (C:\Path\To\Root\*) do @touch "%i"
O
forfiles /P C:\Path\To\Root /S /C "touch @file"
(Nota: si está haciendo esto desde un archivo por lotes y desea usar el for
comando, asegúrese de usar signos de doble porcentaje para sus variables. (Por ejemplo, en %%i
lugar de %i
)
Usando powershell:
C:\> powershell (ls your-file-name-here).LastWriteTime = Get-Date
The property 'LastWriteTime' cannot be found on this object.
En referencia a la respuesta de John T arriba:
Estaba tratando de entender la diferencia entre terminar find
el comando exec de un con a \;
y un '+' (no sabía de este último).
Esto fue útil: (desde aquí )
-exec command ;
Ejecutar comando; verdadero si se devuelve el estado 0. Todos los siguientes argumentos para encontrar se consideran argumentos del comando hasta que un argumento que consista en ';' se encuentra La cadena '{}' se reemplaza por el nombre del archivo actual que se procesa en todas partes donde aparece en los argumentos del comando, no solo en los argumentos donde está solo, como en algunas versiones de find.
-exec command {} +
Esta variante de la acción -exec ejecuta el comando especificado en los archivos seleccionados, pero la línea de comando se crea agregando cada nombre de archivo seleccionado al final; El número total de invocaciones del comando será mucho menor que el número de archivos coincidentes. La línea de comando se construye de la misma manera que xargs construye sus líneas de comando. Solo se permite una instancia de '{}' dentro del comando. El comando se ejecuta en el directorio de inicio.
Considere una carpeta que c:\myfolder
contiene 2 archivos a.txt
yb.txt
find . -type f -exec touch {} +
se interpreta como: touch a.txt b.txt
find . -type f -exec touch {} \;
se interpreta como:touch a.txt
touch b.txt
Por lo tanto, el n. ° 1 es mucho más rápido (pero también adolece de la limitación de que el siguiente comando exec
solo puede tener un {}
marcador de posición).