¿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 montón de archivos a una cierta cantidad de tiempo antes o después (por ejemplo, +8 horas o -4 días, etc.).
Respuesta1
Siempre que sea el propietario del archivo (o raíz), puede cambiar la hora de modificación de un archivo usando el touch
comando:
touch filename
De forma predeterminada, esto establecerá la hora de modificación del archivo en la hora actual, pero hay una serie de indicadores, como el -d
indicador 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 hora de modificación existente, lo siguiente debería ser suficiente:
touch -d "$(date -R -r filename) - 2 hours" filename
Si desea modificar una gran cantidad de archivos, puede utilizar 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 find
seleccionar solo los archivos que le interesan. Si solo desea actualizar los tiempos de modificación del archivo en relación con la hora actual, puede simplificar esto a:
find DIRECTORY -exec touch -d "2 hours ago" {} +
Esta forma no es posible con la versión relativa a la hora del archivo porque utiliza el shell para formar los argumentos de touch
.
En cuanto al tiempo de creación, la mayoría de los sistemas de archivos Linux no realizan un seguimiento de este valor. Hay un archivo ctime
asociado con los archivos, pero rastrea cuándo se cambiaron por última vez los metadatos del archivo. Si nunca se cambian los permisos del archivo, es posible que mantenga 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 el archivo ctime
.
Respuesta2
La forma más sencilla: el acceso y la modificación serán los mismos:
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 -t
y la marca de tiempo.
Para comprobar que son todos iguales:
stat fileName.ext
Ver:toque de hombre
Respuesta3
Gracias por la ayuda. Esto funcionó para mí:
En la terminal, vaya al directorio para editar la fecha. Luego escribe:
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, excepto la última vez -> "listo".
Nota: Es posible que desees cambiar "201203101513"
"201203101513" = es la fecha que desea para todos los archivos en este directorio.
Respuesta4
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