Come posso modificare la data modificata / creata di un file?

200

C'è un modo per cambiare la data in cui un file è stato modificato / creato (che è mostrato in Nautilus o con il comando ls -l)? Idealmente, sto cercando un comando che possa modificare i timbri di data / ora di un intero gruppo di file per un certo periodo di tempo precedente o successivo (ad esempio +8 ore o -4 giorni, ecc.).

    
posta snej 22.09.2011 - 07:32

7 risposte

271

Finché sei il proprietario del file (o root), puoi modificare il tempo di modifica di un file usando il comando touch :

touch filename

Di default questo imposterà il tempo di modifica del file all'ora corrente, ma ci sono un certo numero di flag, come il flag -d per scegliere una data specifica. Ad esempio, per impostare un file come modificato due ore prima del presente, è possibile utilizzare quanto segue:

touch -d "2 hours ago" filename

Se invece vuoi modificare il file rispetto al tempo di modifica esistente, il seguente dovrebbe essere il trucco:

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

Se si desidera modificare un numero elevato di file, è possibile utilizzare quanto segue:

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

Puoi cambiare gli argomenti in find per selezionare solo i file che ti interessano. Se vuoi solo aggiornare i tempi di modifica dei file relativi al tempo presente, puoi semplificarlo in:

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

Questo modulo non è possibile con la versione relativa del file time perché usa la shell per formare gli argomenti a touch .

Per quanto riguarda il tempo di creazione, la maggior parte dei file system Linux non tiene traccia di questo valore. Esiste un ctime associato ai file, ma tiene traccia quando i metadati del file sono stati modificati l'ultima volta. Se il file non ha mai cambiato le sue autorizzazioni, potrebbe capitare di trattenere il tempo di creazione, ma questa è una coincidenza. La modifica esplicita del tempo di modifica del file conta come una modifica dei metadati, quindi avrà anche l'effetto collaterale dell'aggiornamento del ctime .

    
risposta data James Henstridge 22.09.2011 - 08:34
42

Grazie per l'aiuto. Questo ha funzionato per me:

Nel terminale vai alla directory per la modifica della data. Quindi digitare:

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

Vedrai un "& gt;" dopo aver premuto invio, eccetto per l'ultima volta - & gt; "Done".

Nota:  Potresti voler cambiare "201203101513"

"201203101513" = è la data desiderata per tutti i file in questa directory.

Vedi la mia pagina web

    
risposta data EFL 10.03.2012 - 15:21
23

Il modo più semplice - l'accesso e le modifiche saranno le stesse:

touch -a -m -t 201512180130.09 fileName.ext

Dove:

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

Se desideri utilizzare NOW , elimina solo -t e timestamp.

Per verificare che siano tutti uguali: % Co_de%

Vedi: touch man

    
risposta data Jadeye 19.12.2015 - 15:58
8

Touch può fare riferimento alla data di un file da solo, senza bisogno di chiamare date o usare la sostituzione di comando. Ecco un po 'dalla pagina delle informazioni di Touch:

'-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.

Ad esempio, per aggiungere 8 ore alla data di un file (nomefile di file quotato solo in caso di spazi, ecc.):

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

Usando un ciclo su tutti i file nella directory corrente:

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

Ho sentito che usare * e lasciare for scegliere i nomi file è più sicuro , ma usare find -print0 | xargs -0 touch ... dovrebbe gestire la maggior parte personaggi pazzi come newline, spazi, virgolette, backslash in un nome di file. (PS: cerca di non usare caratteri pazzi nei nomi dei file in primo luogo).

Ad esempio, per trovare tutti i file in thatdir i cui nomi di file iniziano con s e aggiungi un giorno al timestamp modificato di quei file, usa:

find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'
    
risposta data Xen2050 17.12.2016 - 15:52
2

Questo script almeno funziona per me

#!/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
    
risposta data joakim 06.08.2013 - 21:40
1

È passato molto tempo da quando ho scritto qualsiasi tipo di programma Unix, ma ho erroneamente impostato l'anno in modo errato su un mucchio di foto di Natale, e sapevo che se non avessi cambiato la data dal 2015 al 2014 sarebbe stata una problema più tardi.

Forse, questo è un compito facile, ma non ho trovato alcun modo semplice per farlo.

Ho modificato uno script che ho trovato qui, che in origine è stato utilizzato per modificare la data di meno un mese.

Ecco lo script originale:

#!/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

Ecco il mio script modificato che ha forzato la data all'anno "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

Ora mi rendo conto che avrei potuto fare una versione più generica:

#!/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

Per utilizzare questo file dovrai scriverlo e

chmod +x fn

da eseguire:

./fn files-to-change

fn = your-file-name-che-è-il-tuo-comando

Esempio

./fn *.JPG

cambierà la data di meno un anno nella directory in cui ti trovi.

    
risposta data RickK 05.01.2015 - 00:28
-6

modifica semplicemente la data e l'ora nelle impostazioni. quindi salva il tuo file, cambia automaticamente

    
risposta data vampiremac 28.11.2012 - 09:37

Leggi altre domande sui tag