¿Cuáles son los usos legítimos del comando `touch`?

83

¿Cuál es el punto del touchcomando? Sé que puedo crear archivos vacíos con él, pero también es el caso con echo -n.

De lo contrario, ¿por qué alguien necesitaría cambiar las marcas de tiempo de un archivo? A menos que cree la falsa impresión sobre la antigüedad de un archivo, no veo ningún otro uso, y este no es legítimo (desde mi punto de vista).

Quora Feans
fuente
15
en lugar de echo -n > filename, puede ejecutar lo siguiente:>filename
AMADANON Inc.
77
¿Cuáles son los usos ilegítimos ?
bmargulies
10
Unless to create the false impression about the age of a file. No es necesaria una falsa impresión. ¿Qué pasa si desea cambiar la hora de modificación? Puede ser útil en scripts. Este script depende en gran medida del touchcomando y es muy conveniente y simple tenerlo así.
VL-80 el
77
Considere qué tar(u otros desarchivadores) hacen cuando extraen un archivo. En general, establecen el tiempo de modificación del archivo en el tiempo del archivo, no en el momento en que se extrajo el archivo, y esta es una característica deseable. Dado que es legítimo que un programa en modo de usuario cree marcas de tiempo falsas, no hay mucho argumento por qué touch(o algún otro programa de línea de comandos) no debería permitirlo basándose en un argumento de línea de comandos. Aprender C no te hace más legítimo que alguien escribiendo un shguión ;-)
Steve Jessop
55
En Unix, no hay marca de tiempo que describa el agede un archivo. Esa sería una creationmarca de tiempo y no existe tal marca de tiempo para los archivos en Unix.
Kevin Fegan

Respuestas:

98

Una ventaja de esto touches que puede especificar marcas de tiempo arbitrarias, mientras echo -nque siempre dará como resultado la hora actual.

Un ejemplo de uso legítimo es actualizar una marca de tiempo de un archivo de código fuente para que un programa como makeeste considere el archivo fuente más nuevo que su objeto compilado y lo reconstruya.

Otros usos son crear archivos que funcionen únicamente en función de su existencia /etc/nologin, por ejemplo , que no permite inicios de sesión si existe. También diría que touch myfilees una construcción más simple que echo -n >> myfile, además de ser más corta de escribir.

casey
fuente
18
otro uso común: tocar un archivo a una fecha específica, luego "buscar / -newer / the / file" para encontrar todos los archivos modificados / creados después de él
Olivier Dulac
@casey Cuando revisé la documentación de echo -n, veo que dice "no mostrar la nueva línea final". Así que no veo cómo puede crear un archivo vacío. ¿Puedes aclarar por favor?
Geek
3
@Geek echo -ngenerará una cadena vacía, y por sí sola no hace nada. Redirigir su salida a través de >>hace que la salida vacía se agregue a un archivo. La redirección hará que el archivo se cree si el archivo no existe.
casey
66
Eso no funciona: abrir un archivo existente para la salida, pero no escribir en él, no cambia el mtime (en mi sistema, de todos modos). Incluso si lo hiciera, no necesita y no debe usar echo -nun comando que no hace nada. echo -npuede generar la cadena "-n" debajo de algunos shells. Si realmente necesita un comando que no hace nada, :o truees una mejor opción, pero >> myfilepor sí mismo también es una forma perfectamente válida de crear el archivo si no existe. Todo esto, por supuesto, respalda su respuesta de que solo debe usar "touch".
hvd
40

La llamada al sistema subyacente ( utime) es importante para varias utilidades como tarpoder configurar las marcas de tiempo de un archivo recién copiado (sin tarred). Algunas utilidades de respaldo también se pueden optar por restablecer el último acceso de los archivos que han copiado.

Un uso legítimo de touches crear un archivo con una marca de tiempo particular. Tal archivo de "referencia" puede ser utilizado por comandos como find. Por ejemplo, para buscar todos los archivos modificados más recientemente que el 1 de noviembre de 2013 (es decir, 2013/11/01) "

touch -amt 201311010000 myref
find . -type f -newer myref -exec ls -ld {} +
JRFerguson
fuente
¿Cómo calcular eso 201311010000 significa Nov1,2013? ¿Hay alguna utilidad que me diga esto? En otras palabras, ¿cómo determino la entrada a tocar?
Geek
44
@Geek Al observar el número y observar que la primera parte, 20131101se puede dividir en 2013-11-01, o el 1 de noviembre de 2013. Luego puede suponer que la 0000parte indica una hora específica del día, en este caso 00 horas, 00 minutos. O simplemente puede mirar la página de manual touch, que le dice exactamente cuál es el formato (ver -t).
JAB
@ Geek Las páginas de manual son tu amigo :-)
JRFerguson
39

El touchpropósito principal del comando es manipular las marcas de tiempo de los archivos y crear archivos.

Ejemplos

1. crear archivos

$ ls -l
total 0

$ touch file{1..3}

$ ls -l
total 0
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file1
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file2
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file3

NOTA: La total 0salida de ls -les correcta. Esta implementación de lsmuestra el número de bloques que utilizan los archivos cuando se enumeran. Puede asegurarse de este hecho agregando el -sinterruptor a ls. Esto enumerará los bloques en uso por cada archivo. Aquí he agregado 2 caracteres a archivo1 y archivo2.

Ejemplo

$ ls -ls
total 8
4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:07 file1
4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:09 file2
0 -rw-rw-r--. 1 saml saml 0 Jan 13 12:05 file3

2. información de hora / fecha de un archivo - comando stat

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2014-01-12 13:33:38.279456149 -0500
Modify: 2014-01-12 13:33:38.279456149 -0500
Change: 2014-01-12 13:33:38.279456149 -0500
 Birth: -

Podemos utilizar touchpara manipular las diversas marcas de tiempo en un archivo determinado.

3. extracto de la página de manual de touch

   -a     change only the access time
   -m     change only the modification time
   -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time

4. manipulando el tiempo de acceso

$ touch -a -t200001010000 file1

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2000-01-01 00:00:00.000000000 -0500
Modify: 2014-01-12 13:33:38.279456149 -0500
Change: 2014-01-12 13:38:52.023434696 -0500
 Birth: -

5. manipular modificar tiempo

$ touch -m -t200001010000 file1

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2000-01-01 00:00:00.000000000 -0500
Modify: 2000-01-01 00:00:00.000000000 -0500
Change: 2014-01-12 13:39:31.060432026 -0500
 Birth: -

Tal vez se pregunte sobre el tiempo de cambio (ctime). Eso no puede ser manipulado usando touch. Eso rastrea el momento en que se tocó cualquiera de los metadatos en el archivo. Consulte estas preguntas y respuestas de U&L para obtener más detalles, titulado: ¿Qué puede hacer en un archivo sin activar la marca de tiempo "Cambiar"? .

slm
fuente
@sim: mi pregunta implica que sé que el toque es para cambiar las marcas de tiempo. Solo quería saber por qué un usuario honesto querría eso. Si no fuera por la parte ctime de tu respuesta, te hubiera dado un -1.
Quora Feans
16
@QuoraFea: mi respuesta es para su beneficio y para el usuario que lo encuentre en el futuro. Por favor, no asumas que una respuesta es puramente por tu bien y lamento si te ofendí de alguna manera, no fue mi intención, solo estaba tratando de explicar las bases de cómo funciona el tiempo.
slm
@ sim: no me ofende, solo pensé que la respuesta no iba en la dirección correcta. De todos modos, gracias por esta respuesta.
Quora Feans
@QuoraFea: de nada, y gracias por tu Q. ¡Son apreciados!
slm
1
@ Geek: prueba los comandos. Esa es la salida correcta de ls -lun directorio donde los archivos tienen tamaño 0, y todavía no existe nada más. Tan pronto como proporcione el tamaño de uno de los archivos, aparecerá el total con la cantidad de bloques en uso por los archivos. Vea mis actualizaciones si no está seguro, he agregado un ejemplo.
slm
20

Además de las otras dos muy buenas respuestas que obtuvo, otro uso es, en sus palabras, para

crear la falsa impresión sobre la antigüedad de un archivo

por ejemplo para usar en esquemas de respaldo . Es posible que no desee actualizar una copia de seguridad con una nueva porque son idénticas o porque los cambios son irrelevantes en comparación con el costo de actualizar una copia de seguridad en, por ejemplo, una línea lenta a un host remoto. Para lograr esto, tiene la opción simple de marcar el archivo de copia de seguridad con una marca de tiempo más nueva, sin falsificar, pero declarando que la marca de tiempo de validez de ese archivo ahora es diferente.

La impresión sobre la antigüedad del archivo ahora es realmente falsa, pero su significado es real y legítimo.

LSerni
fuente
20

Uno de los usos más comunes de touches, o al menos solía ser, para desencadenar una reconstrucción de código.

Las herramientas de compilación habituales, makey sus derivados, intentan ahorrar trabajo al no volver a compilar / reconstruir archivos, a menos que uno de los archivos que los creó haya cambiado, por ejemplo, si un archivo .o es más reciente que el .c fuente, generalmente es seguro suponer que la fuente C no ha cambiado desde que se compiló para producir ese archivo de objeto.

Pero hay momentos en los que quieres forzar la reconstrucción de algo. Podría realizar una modificación innecesaria en uno de sus archivos fuente, pero eso corre el riesgo de dañar accidentalmente algo. En cambio, podría simplemente touchel archivo, haciéndolo parecer nuevo sin ningún riesgo de alterar su contenido, y eso sería suficiente para convencer de makeque era hora de reconstruir todo lo que depende de ese archivo.

Hay otros usos, pero históricamente ese fue el más importante.

keshlam
fuente
Si bien parece una buena idea cambiar un archivo para causar una reconstrucción, argumentaría en contra de él. Algunos sistemas de revisión de código fuente pueden confundirse acerca de un archivo modificado. Entonces touches tan malo como un cambio manual. Para provocar una reconstrucción, sugiero eliminar los archivos .ode salida de la fuente en cuestión.
Harper
1
Los cambios manuales y la eliminación de los archivos .o requieren más tiempo y escritura, y un cambio manual es mucho más propenso a errores. Y solo estamos hablando de modificar la marca de tiempo en una copia de trabajo: si las modificaciones se realizan después, el archivo reflejará correctamente la marca de tiempo de cambio. Y no todos los sistemas de control de versiones están confundidos por una marca de tiempo.
David
1
Como dijo David. Esto realmente era una práctica estándar de Unix no hace mucho tiempo, y sigue siendo una práctica estándar para los desarrolladores que trabajan fuera de IDE.
keshlam
12

He trabajado con al menos un marco web (no recuerdo cuál) que en modo de desarrollo observaba los cambios en los archivos de código fuente y volvía a cargar la aplicación cuando eso sucedía.

Por supuesto, a veces querías que se volviera a cargar después de cambiar algo que no estaba viendo, en cuyo caso touchsu archivo de configuración principal funcionó.

Por lo tanto, en el caso general, cada vez que desee iniciar un proceso desencadenado por cambios en un archivo, sin cambiar realmente el archivo.

milimoose
fuente
44
Este es realmente el caso con mod_wsgi y apache; puede recargar, por ejemplo, una aplicación web django con solo tocar el archivo wsgi.
sapi
11

Uso legítimo del tacto:

  • Actualice la marca de tiempo de los archivos de imagen (GIF / JPG / etc.) a la hora en que se tomaron. No todos los procesadores leen o prestan atención a la información EXIF.
  • Mantenga el tiempo c / m cuando actualice en masa un conjunto de archivos donde la marca de tiempo es importante para el paquete de archivos.
  • Establezca la hora de un archivo por lotes (es decir, CSV) si necesita realizar otra importación después de un error, y el programa de importación depende de la marca de tiempo (deje esa discusión en otro tema :-))
  • Con fines de archivo, es decir, tener copias de seguridad en carpetas según el año, luego configurar la hora en estas carpetas al 1 de enero AAAA para una clasificación fácil
sastorsl
fuente
7

Un uso es corregir la marca de tiempo de un archivo que se configuró incorrectamente.

Por ejemplo, la mayoría de las formas en que copia un archivo (y de alguna manera que podría mover un archivo) da como resultado que el nuevo archivo tenga una marca de tiempo de la hora actual, en lugar de la marca de tiempo del archivo original.

Por lo general, esto no es lo que se desea. El tacto puede "arreglar" eso.

Otro uso es reflejar una modificación de archivo que se deshizo restaurando la marca de tiempo del archivo a lo que era antes de las operaciones "editar ... deshacer-editar".

Kevin Fegan
fuente
2
En efecto. El tiempo que he encontrado alias cp='cp --preserve=timestamps'es más adecuado para mí en PC
Land
5

Una diferencia importante frente a me thingsgusta echo(o incluso mejor > filecomo lo mencionaron otros) es que el tacto no destruirá el contenido. > filevaciará un archivo touchNo lo haré. En lugar de pensar en trucos para evitar dañar el contenido, ¡solo usa el tacto! De todos modos, hará menos trabajo en el núcleo, porque solo funcionará con los atributos del archivo sin perder tiempo preparándose para una apertura y luego realizando un cierre.

El tacto probablemente puede alterar la marca de tiempo, incluso si el archivo está actualmente bajo un bloqueo obligatorio o de aviso, o está abierto de forma exclusiva. Hmmm, nunca he probado eso o leído sobre eso ...


fuente
2
>>se agregará en lugar de sobrescribir
Michael Mrozek
Pensé en mencionar eso, pero se está poniendo aún más en territorio de efectos secundarios. También tendría que mencionar el hecho de que arrojaría un error si el archivo ya estuviera abierto de forma exclusiva, etc., etc. Un problema que podría aplicarse mediante el uso de> también. Supongo que mi punto secundario, más allá del primario, de que es marginalmente más rápido simplemente tocar las estadísticas del archivo, es que es una buena idea escribir código que lo diga directamente, en lugar de andar por las ramas.
4

Aquí hay uno: utilizo un programa de software llamado SageTV para grabar programas de televisión; a menudo se graban en MPEG-2, que no es un códec muy eficiente, tampoco es compatible con iPad / iPhone. Entonces convierto los archivos a archivos .mp4. Pero al reproducir los archivos, SageTV espera que la marca de tiempo del archivo sea cuando comenzó el programa de TV; si no, arruina la línea de tiempo del programa para que no sea fácil FF o REW. Por lo tanto, utilizo la función táctil para restablecer la marca de tiempo del archivo .mp4 para que sea la misma que el archivo original.
¿Es eso legítimo?

Wayner
fuente
2

A menudo puede tener un proceso que cambia de userid, como desde root -> algo más. Touch puede darle la oportunidad de crear un archivo en un lugar que solo root puede tocar antes de que la aplicación comience a iniciar sesión como el otro usuario.

usuario56560
fuente
Ese no es un uso del tacto que no se puede lograr con el "eco" - vea la pregunta original del autor
Domingo Ignacio Galdos
Eco implica abrir una corriente y tal. Touch podría estar hiper optimizado trabajando directamente con inodos. RENDIMIENTO FTW!
user56560
2

En el trabajo tenemos un archivo de mapas digitales de más de 15 años. Estos mapas antiguos se guardan en una variedad de formatos como PostScript, EMF, PRN, hpgl2, pdf, etc. que la mayoría de los programas no entienden. O necesita una docena de programas diferentes para verlos a todos.

Para facilitar la búsqueda y exploración fácil de todos estos formatos diferentes, creamos versiones jpeg de los mapas y luego usamos la función táctil para hacer que el archivo jpeg coincida con la marca de tiempo del archivo fuente original, a menudo años después de que se hizo el original.

Ahora podemos usar un solo programa como Picasa para ver toda la biblioteca y localizar trivialmente ciertos rangos de fechas. Sin tocar, tendríamos que agregar metadatos de fecha para cada imagen, probablemente de forma manual, y luego buscar esas cadenas al buscar un rango de fechas específico.

wilkie mate
fuente
1

Todavía no lo he usado para este propósito, pero tengo un script que lee los archivos y sus fechas desde un directorio y los lee para usar en una página web. Si tengo que editar uno, cambiará su fecha. He considerado touchinvitarlos a restablecer su orden.

TecBrat
fuente
1

Algunos guiones de inicio comparan la marca de tiempo de un archivo de configuración con su propio archivo pid. El resultado decide si volver a cargar el servicio en ejecución o no.

Si hay una situación en la que no desea cambiar la configuración pero desea forzar la recarga, toque aquí lo ayuda.

Nils
fuente
0

Tengo un trabajo cron que obtiene los cambios de una base de datos que se han producido entre la última ejecución del trabajo y la ejecución actual. Produce un archivo XML de los cambios que luego se procesan en una base de datos diferente. Obtiene el último tiempo de ejecución de la marca de tiempo en el archivo de salida XML. *

Si algo sale mal en el procesamiento del archivo XML, es posible que desee repetir la ejecución desde la fecha original, no desde la fecha mencionada en la marca de tiempo del nuevo archivo XML.

La forma más sencilla de hacer esto, en lugar de editar los scripts que se llaman, etc., es tocar el archivo XML y forzar que la marca de tiempo sea la fecha que requiero.

Además, si empiezo de nuevo (sin archivo de salida XML anterior), simplemente puedo simular su existencia mediante el tacto.

[*] Antes de que alguien lo señale, me doy cuenta de la hora en que comienza el trabajo y la escritura del archivo XML deja un intervalo de tiempo de unos pocos minutos donde podrían ocurrir cambios en la base de datos. El trabajo se ejecuta en un momento en que los cambios de DB son extremadamente improbables. Esa es mi excusa y me quedo con ella :-)

Geeb
fuente