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


234

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 cambiare i timbri di data / ora di un intero gruppo di file in un certo periodo di tempo prima o dopo (ad es. +8 ore o -4 giorni ecc.).

Risposte:


324

Finché sei il proprietario del file (o root), puoi cambiare il tempo di modifica di un file usando il touchcomando:

touch filename

Per impostazione predefinita, questo imposterà l'ora di modifica del file sull'ora corrente, ma ci sono un numero di flag, come il -dflag per scegliere una data particolare. Ad esempio, per impostare un file come modificato due ore prima del presente, è possibile utilizzare quanto segue:

touch -d "2 hours ago" filename

Se si desidera modificare il file in relazione al tempo di modifica esistente, è necessario fare quanto segue:

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 modificare gli argomenti in findper selezionare solo i file che ti interessano. Se desideri aggiornare solo i tempi di modifica dei file rispetto a quelli attuali, puoi semplificare questo per:

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

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

Per quanto riguarda il tempo di creazione, la maggior parte dei file system Linux non tiene traccia di questo valore. È ctimeassociato un file, ma tiene traccia dell'ultima modifica dei metadati del file. Se il file non ha mai le autorizzazioni modificate, potrebbe accadere che mantenga 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 di aggiornare il file ctime.


Per citare il caso più semplice quando tutti i file si trovano nella stessa cartella: touch -d "2 hours ago" /path/*.txtad esempio.
enzotib,

1
Aggiungo anche che cambiare il ctimenon è possibile in alcun modo standard.
organizzare il

È tutto POSIX?
user1011471

1
Le informazioni su ctimecome tempo di cambio dei metadati provengono da POSIX. Non so se i frammenti di shell nella mia risposta funzionerebbero con rigide utility di shell POSIX. Ma funzionano sicuramente su Ubuntu, che è il contesto per le risposte su questo sito.
James Henstridge,

1
Su OSX, potresti voler utilizzare gtouchtramite brew install coreutils.
Nobu,

46

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 ">" dopo aver premuto invio, eccetto per l'ultima volta -> "fatto".

Nota: potresti voler cambiare "201203101513"

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

Vedi la mia pagina web


non funziona come previsto se un nome file contiene spazi vuoti
Angelo

La pagina web non è più, sebbene siano trascorsi 6 anni. Tuttavia, questa è la risposta che stavo cercando. Per coloro che vogliono includere secondi nel loro tempo, utilizzare .ssdove ss è il numero di secondi. (Nota: questo non sembra controllare i tempi dei secondi inferiori come nanosecondi o millisecondi, che per me sono apparsi come zeri; tuttavia, questa differenza era ammissibile per il mio caso d'uso.)
Spencer D

34

Il modo più semplice: l'accesso e la modifica saranno gli stessi:

touch -a -m -t 201512180130.09 fileName.ext

Dove:

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

Se si desidera utilizzare, NOWrilasciare -te il timestamp.

Per verificare che siano tutti uguali: stat fileName.ext

Vedi: tocca l'uomo


1
Ho provato a verificarlo usando stat, ma nessuno dei touchflag ha portato a un risultato corretto. La data di modifica viene modificata, ma la data di modifica e di accesso viene effettivamente cambiata in ORA
Xerus

Non ha funzionato per me, ha cambiato solo il tempo "Modifica"
Revious

@Revious, Xerus Qual è la differenza tra il changedtempo e il modifiedtimestamp?
ijoseph,

9

Il tocco può fare riferimento alla data di un file da solo, non è necessario chiamare dateo utilizzare la sostituzione dei comandi. 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 (nome file filecitato solo in caso di spazi, ecc.):

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

Utilizzando 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 a *e lasciare forscegliere i nomi dei file stessi è più sicuro , ma l'utilizzo find -print0 | xargs -0 touch ... dovrebbe gestire la maggior parte dei personaggi folli come nuove righe, spazi, virgolette, barre rovesciate in un nome file. (PS. Cerca di non usare personaggi pazzi nei nomi dei file, in primo luogo).

Ad esempio, per trovare tutti i file nei thatdircui nomi di file iniziano con un se aggiungere un giorno alla data / ora modificata di tali file, utilizzare:

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

2

Questa piccola sceneggiatura funziona almeno 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

2
Modificare la data delle immagini in base alle meta informazioni nell'immagine sarebbe piuttosto utile. L'identificazione di ImageMagick può essere utilizzata. ad es. 'identifica -verbose <immagine> | grep -i data', 'identifica -formato% [exif: DateTime] <immagine>' potrebbe mostrare '2015: 01: 08 10:19:10' (non tutte le immagini hanno dati exif ). Funziona (usando sed per convertire la data in cui il touch può essere gestito): 'touch -d $ (identifica -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
gaoithe,

1

È passato molto tempo da quando ho scritto qualsiasi tipo di programma Unix, ma ho accidentalmente 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 stato un problema in seguito .

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

Ho modificato uno script che ho trovato qui, che originariamente era utilizzato per modificare la data di meno un mese.

Ecco la sceneggiatura 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 copione modificato che ha costretto 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 usare questo file dovresti scriverlo e

chmod +x fn

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.


1
Come sopra commento. La maggior parte dei file .jpg avrà la data incorporata nei metadati pubblicizzati dalla fotocamera. Funziona (usando sed per convertire la data in cui il touch può essere gestito): 'touch -d $ (identifica -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
gaoithe,

-6

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


3
Snej è alla ricerca di una soluzione batch o da riga di comando che può essere utilizzata per modificare più file. Cambiare ora e data del sistema e modificare i file probabilmente non è una soluzione ideale.
fabricator4,

troppo triiiiiiicky !!!
Philippe Gachoud,

Per quelli con altri sistemi operativi portati qui tramite la ricerca Web, questa risposta è il modo più semplice per cambiare la data di un file su Mac OSX ('touch -d' risulta in 'opzione illegale').
alanning il

1
@alanning: OSX ha un tocco BSD, non un tocco GNU. Usa -t. developer.apple.com/library/mac/documentation/Darwin/Reference/…
Dominik R

Ciò può avere conseguenze impreviste. In un sistema operativo moderno, molti file vengono continuamente modificati dietro le quinte. Mentre la tua data è cambiata, molti altri file potrebbero avere dei timbri errati su di essi e tutto può succedere quando qualcos'altro nel sistema nota che un file è più vecchio del previsto.
Joe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.