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

191

¿Hay alguna forma 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 grupo completo de archivos a una cierta cantidad de tiempo antes o después (por ejemplo, +8 horas o -4 días, etc.).

    
pregunta snej 22.09.2011 - 07:32

7 respuestas

258

Puede cambiar el tiempo de modificación de un archivo utilizando el comando touch :

touch filename

De forma predeterminada, establecerá la hora de modificación del archivo en la hora actual, pero hay una serie de indicadores, como el indicador -d para elegir una fecha en particular. Por ejemplo, para establecer un archivo como modificado dos horas antes del presente, podría usar lo siguiente:

touch -d "2 hours ago" filename

Si desea modificar el archivo relativo a su hora 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 a find para seleccionar solo los archivos que le interesan. Si solo desea actualizar los tiempos de modificación del archivo relativos a la hora actual, puede simplificar esto a:

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

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

En lo que respecta al tiempo de creación, la mayoría de los sistemas de archivos Linux no realizan un seguimiento de este valor. Hay un ctime asociado a los archivos, pero realiza un seguimiento cuando se modificaron por última vez los metadatos del archivo. Si el archivo nunca tiene sus permisos modificados, es posible que contenga la hora 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 el ctime .

    
respondido por el James Henstridge 22.09.2011 - 08:34
39

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

En la terminal, vaya al directorio para editar fechas. Luego escribe:

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

Verás un "& gt;" después de presionar enter, exept por última vez - & gt; "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

    
respondido por el EFL 10.03.2012 - 15:21
22

La forma más sencilla: acceder y modificar será la misma:

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 NOW , simplemente suelte el -t y la marca de tiempo.

Para verificar que son todos iguales: stat fileName.ext

Ver: tocar hombre

    
respondido por el Jadeye 19.12.2015 - 15:58
6

Touch puede hacer referencia a la fecha de un archivo por sí mismo, sin necesidad de llamar a date o 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 de file citado solo en el caso de espacios, etc.):

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

Usar un ciclo sobre todos los archivos en el directorio actual:

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

He oído que usar * y dejar que for elija los nombres de los archivos es más seguro , pero usar find -print0 | xargs -0 touch ... debe manejar la mayoría de los personajes locos como nuevas líneas, espacios, comillas, barras invertidas en un nombre de archivo. (PD: en primer lugar, trate de no usar caracteres locos en nombres de archivos).

Por ejemplo, para buscar todos los archivos en thatdir cuyos nombres de archivo comienzan con 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' '{}'
    
respondido por el Xen2050 17.12.2016 - 15:52
2

Este pequeño script al menos funciona para mí

#!/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
    
respondido por el joakim 06.08.2013 - 21:40
1

Ha pasado mucho tiempo desde que escribí cualquier tipo de programa Unix, pero accidentalmente puse 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 una problema más adelante.

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

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

Aquí está el script 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 al 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ás escribirlo y

chmod +x fn

para ejecutar:

./fn files-to-change

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

Ejemplo

./fn *.JPG

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

    
respondido por el RickK 05.01.2015 - 00:28
-6

simplemente cambie la fecha y la hora en la configuración. luego guarda tu archivo, cambia automáticamente

    
respondido por el vampiremac 28.11.2012 - 09:37

Lea otras preguntas en las etiquetas