¿Cómo puedo cambiar la fecha de modificación / creación de un archivo?

234

¿Hay alguna manera de cambiar la fecha en que se modificó / creó un archivo (que se muestra en Nautilus o con el comando ls -l)? Idealmente, estoy buscando un comando que pueda cambiar las marcas de fecha / hora de un montón de archivos a una cierta cantidad de tiempo antes o después (por ejemplo, +8 horas o -4 días, etc.).

snej
fuente

Respuestas:

324

Mientras sea el propietario del archivo (o raíz), puede cambiar la hora de modificación de un archivo con el touchcomando:

touch filename

De forma predeterminada, esto establecerá la hora de modificación del archivo a la hora actual, pero hay una serie de banderas, como la -dbandera para elegir una fecha en particular. Entonces, por ejemplo, para configurar un archivo como modificado dos horas antes del presente, puede usar lo siguiente:

touch -d "2 hours ago" filename

Si desea modificar el archivo en relación con su tiempo de modificación existente, lo siguiente debería ser el truco:

touch -d "$(date -R -r filename) - 2 hours" filename

Si desea modificar una gran cantidad de archivos, puede usar lo siguiente:

find DIRECTORY -print | while read filename; do
    # do whatever you want with the file
    touch -d "$(date -R -r "$filename") - 2 hours" "$filename"
done

Puede cambiar los argumentos para findseleccionar solo los archivos que le interesan. Si solo desea actualizar los tiempos de modificación de archivos en relación con el tiempo actual, puede simplificar esto para:

find DIRECTORY -exec touch -d "2 hours ago" {} +

Este formulario no es posible con la versión relativa del tiempo de archivo porque usa el shell para formar los argumentos touch.

En lo que respecta al tiempo de creación, la mayoría de los sistemas de archivos de Linux no realizan un seguimiento de este valor. Hay un ctimearchivo asociado con los archivos, pero realiza un seguimiento de cuándo se modificaron por última vez los metadatos del archivo. Si el archivo nunca tiene sus permisos modificados, puede que retenga el tiempo de creación, pero esto es una coincidencia. Cambiar explícitamente el tiempo de modificación del archivo cuenta como un cambio de metadatos, por lo que también tendrá el efecto secundario de actualizar ctime.

James Henstridge
fuente
Para mencionar el caso más simple cuando todos los archivos están en la misma carpeta: touch -d "2 hours ago" /path/*.txtpor ejemplo.
enzotib
1
También agregaría que cambiar el ctimeno es posible de ninguna manera estándar.
organizar el
¿Es todo esto POSIX?
user1011471
1
La información sobre el ctimetiempo de cambio de metadatos es de POSIX. No sé si los fragmentos de shell en mi respuesta funcionarían con estrictas utilidades de shell POSIX. Pero definitivamente funcionan en Ubuntu, que es el contexto para las respuestas en este sitio.
James Henstridge
1
En OSX, es posible que desee utilizar a gtouchtravés de brew install coreutils.
Nobu
46

Gracias por la ayuda. Esto funcionó para mí:

En la terminal, vaya al directorio para editar la fecha. Luego escriba:

find -print | while read filename; do
    # do whatever you want with the file
    touch -t 201203101513 "$filename"
done

Verá un ">" después de presionar enter, exept por última vez -> "hecho".

Nota: es posible que desee cambiar "201203101513"

"201203101513" = es la fecha que desea para todos los archivos en este directorio.

Ver mi página web

EFL
fuente
no funciona como se esperaba si un nombre de archivo contiene espacios en blanco
Angel
La página web ya no existe, aunque sea 6 años después. Sin embargo, esta es la respuesta que estaba buscando. Para aquellos que desean incluir segundos en su tiempo, use .ssdonde ss es la cantidad de segundos. (Nota: esto no parece controlar los tiempos de menos de un segundo, como nanosegundos o milisegundos, que para mí solo aparecían como ceros; sin embargo, esta diferencia era permisible para mi caso de uso.)
Spencer D,
34

La forma más fácil: acceder y modificar será lo mismo:

touch -a -m -t 201512180130.09 fileName.ext

Dónde:

-a = accessed
-m = modified
-t = timestamp - use [[CC]YY]MMDDhhmm[.ss] time format

Si desea utilizar NOWsimplemente suelte -tla marca de tiempo y.

Para verificar que todos son iguales: stat fileName.ext

Ver: tocar hombre

Jadeye
fuente
1
Traté de verificarlo usando stat, pero ninguno de los touchindicadores condujo a un resultado correcto. La fecha de modificación se ajusta, pero la fecha de cambio y acceso se cambia realmente a AHORA
Xerus
No funcionó para mí, solo cambió el tiempo de "Cambio"
Anterior
@Revious, Xerus ¿Cuál es la diferencia entre la changedhora y las modifiedmarcas de tiempo?
ijoseph
9

Touch puede hacer referencia a la fecha de un archivo por sí mismo, sin necesidad de llamar dateo usar la sustitución de comandos. Aquí hay un poco de la página de información táctil:

`-r FILE' `--reference=FILE'
     Use the times of the reference FILE instead of the current time.
     If this option is combined with the `--date=TIME' (`-d TIME')
     option, the reference FILE's time is the origin for any relative
     TIMEs given, but is otherwise ignored.  For example, `-r foo -d
     '-5 seconds'' specifies a time stamp equal to five seconds before
     the corresponding time stamp for `foo'.  If FILE is a symbolic
     link, the reference timestamp is taken from the target of the
     symlink, unless `-h' was also in effect.

Por ejemplo, para agregar 8 horas a la fecha de un archivo (nombre de archivo entre filecomillas solo en caso de espacios, etc.):

touch -r "file" -d '+8 hour' "file"

Usando un bucle sobre todos los archivos en el directorio actual:

for i in *; do touch -r "$i" -d '+8 hour' "$i"; done

Escuché que usar a *y dejar que forlos nombres de los archivos sean más seguros es más seguro , pero usar find -print0 | xargs -0 touch ... debería manejar la mayoría de los caracteres locos como líneas nuevas, espacios, comillas y barras diagonales en un nombre de archivo. (PD. Trate de no usar caracteres locos en los nombres de archivo en primer lugar).

Por ejemplo, para buscar todos los archivos thatdircuyos nombres de archivo comiencen con un s, y agregar un día a la marca de tiempo modificada de ese archivo, use:

find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'
Xen2050
fuente
2

Este pequeño guión al menos me funciona

#!/bin/bash

# find specific files
files=$(find . -type f -name '*.JPG')

# use newline as file separator (handle spaces in filenames)
IFS=$'\n'

for f in ${files}
do
 # read file modification date using stat as seconds
 # adjust date backwards (1 month) using date and print in correct format 
 # change file time using touch
 touch -t $(date -v -1m -r $(stat -f %m  "${f}") +%Y%m%d%H%M.%S) "${f}"
done
joakim
fuente
2
Ajustar la fecha de las imágenes según la metainformación de la imagen sería bastante útil. Se puede usar la identidad de ImageMagick. por ejemplo, 'generate -verbose <image> | grep -i date', 'generate -format% [exif: DateTime] <image>' podría mostrar '2015: 01: 08 10:19:10' (no todas las imágenes tienen datos exif ) Esto funciona (usando sed para convertir la fecha al formato táctil puede manejar): 'touch -d $ (identificar -formato% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
gaoithe
1

Ha pasado mucho tiempo desde que escribí cualquier tipo de programa Unix, pero accidentalmente configuré el año incorrectamente en un montón de fotos de Navidad, y sabía que si no cambiaba la fecha de 2015 a 2014 sería un problema más adelante. .

Tal vez, esta es una tarea fácil, pero no encontré ninguna forma simple de hacerlo.

Modifiqué un script que encontré aquí, que originalmente se usó para modificar la fecha en menos un mes.

Aquí está el guión original:

#!/bin/bash

# find specific files
files=$(find . -type f -name '*.JPG')

# use newline as file separator (handle spaces in filenames)
IFS=$'\n'

for f in ${files}
do
 # read file modification date using stat as seconds
 # adjust date backwards (1 month) using date and print in correct format 
 # change file time using touch
 touch -t $(date -v -1m -r $(stat -f %m  "${f}") +%Y%m%d%H%M.%S) "${f}"
done

Aquí está mi script modificado que forzó la fecha del año "2014":

#!/bin/bash 

# find specific files
#files=$(find . -type f -name '*.JPG')

# use newline as file separator (handle spaces in filenames)
IFS=$'\n'

for f in $*
do
 # read file modification date using stat as seconds
 # adjust date backwards (1 month) using date and print in correct format 
 # change file time using touch
 touch -t $(date -v +1y -r $(stat -f %m  "${f}") +2014%m%d%H%M.%S) "${f}"
done

Ahora me doy cuenta de que podría haber hecho una versión más genérica:

#!/bin/bash 

# find specific files
#files=$(find . -type f -name '*.JPG')

# use newline as file separator (handle spaces in filenames)
IFS=$'\n'

for f in $*
do
 # read file modification date using stat as seconds
 # adjust date backwards (1 month) using date and print in correct format 
 # change file time using touch (+1y adds a year "-1y" subtracts a year)
 # Below line subtracts a year
 touch -t $(date -v -1y -r $(stat -f %m  "${f}") +%Y%m%d%H%M.%S) "${f}"
 # Below line adds a year
 # touch -t $(date -v +1y -r $(stat -f %m  "${f}") +%Y%m%d%H%M.%S) "${f}"
done

Para usar este archivo necesitaría escribirlo y

chmod +x fn

ejecutar:

./fn files-to-change

fn = tu-nombre-archivo-que-es-tu-comando

Ejemplo

./fn *.JPG

cambiará la fecha en menos un año en el directorio donde se encuentre.

RickK
fuente
1
Igual que el comentario anterior. La mayoría de los archivos .jpg tendrán fecha incrustada en metadatos agregados por la cámara. Esto funciona (usando sed para convertir la fecha al formato táctil puede manejar): 'touch -d $ (identificar -formato% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
gaoithe
-6

solo cambia la fecha y la hora en la configuración. luego guarde su archivo, cambia automáticamente

vampiremac
fuente
3
Snej está buscando una solución de línea de comandos o lote que pueda usarse para modificar múltiples archivos. Cambiar la hora y la fecha del sistema y modificar los archivos probablemente no sea una solución ideal.
fabricator4
demasiado triiiiiiicky !!!
Philippe Gachoud
Para aquellos con otros sistemas operativos traídos aquí a través de la búsqueda web, esta respuesta es la forma más simple de cambiar la fecha de un archivo en Mac OSX ('touch -d' da como resultado 'opción ilegal').
alanning
1
@alanning: OSX tiene BSD touch, no GNU touch. Use -t. developer.apple.com/library/mac/documentation/Darwin/Reference/…
Dominik R
Eso puede tener consecuencias imprevistas. En un sistema operativo moderno, muchos archivos se modifican detrás de escena todo el tiempo. Mientras se cambia su fecha, muchos otros archivos pueden tener marcas de fecha incorrectas y cualquier cosa puede suceder cuando algo más en el sistema advierte que un archivo es más antiguo de lo esperado.
Joe