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


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


192
2017-09-22 05:32


origine




risposte:


È possibile modificare l'ora di modifica di un file utilizzando il touch comando:

touch filename

Di default questo imposterà il tempo di modifica del file all'ora corrente, ma ci sono un numero di flag, come il -d flag 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 rispetto al tempo di modifica esistente, il seguente dovrebbe fare 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

È possibile modificare gli argomenti in find per selezionare solo i file che ti interessano. Se vuoi solo aggiornare i tempi di modifica del file relativi al tempo presente, puoi semplificarlo per:

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

Questo modulo non è possibile con la versione relativa all'ora del file perché usa 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. C'è 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. Il cambio esplicito del tempo di modifica del file conta come una modifica dei metadati, quindi avrà anche l'effetto collaterale dell'aggiornamento del ctime.


259
2017-09-22 06:34



Per citare il caso più semplice quando tutti i file si trovano nella stessa cartella: touch -d "2 hours ago" /path/*.txt, per esempio. - enzotib
Vorrei anche aggiungere che cambiando il ctime non è possibile in nessun modo standard. - arrange
È tutto POSIX? - user1011471
Le informazioni su ctime come un tempo di cambiamento dei metadati proviene da POSIX. Non so se i frammenti della shell nella mia risposta funzionerebbero con le rigide utilità della shell POSIX. Ma sicuramente funzionano su Ubuntu, che è il contesto per le risposte su questo sito. - James Henstridge
touch: illegal option -- d - User


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


40
2018-03-10 14:21



non funziona come previsto se il nome di un file contiene spazi vuoti - Angel


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 si desidera utilizzare NOW lascia cadere il -t e il timestamp.

Per verificare che siano tutti uguali: stat fileName.ext

Vedere: tocco uomo


22
2017-12-19 14:58



Ho provato a verificarlo usando stat, ma nessuno dei due touch le bandiere portano a un risultato corretto. La data di modifica viene regolata, ma la data di modifica e l'accesso sono effettivamente cambiati in NOW - Xerus


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

`-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 di file citato 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 usando un * e lasciando for scegliere i nomi dei file stessi più sicuro, ma usando find -print0 | xargs -0 touch ...  dovrebbe gestire maggior parte personaggi pazzi come newline, spazi, virgolette, backslash in un nome di file. (PS: cerca di non usare personaggi pazzi nei nomi dei file in primo luogo).

Ad esempio, per trovare tutti i file in thatdiri cui nomi di file iniziano con un se aggiungi un giorno al timestamp modificato di quel file, usa:

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

6
2017-12-17 14:52





Questo piccolo 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

2
2017-08-06 19:40



La regolazione della data delle immagini basata sulle meta informazioni nell'immagine sarebbe piuttosto utile. L'identificazione di ImageMagick può essere utilizzata. per esempio. 'identifica -verbose <immagine> | grep -i date', 'identify -format% [exif: DateTime] <image>' potrebbe mostrare '2015: 01: 08 10:19:10' (non tutte le immagini hanno dati exif) . Funziona (usando sed per convertire la data in formato touch in grado di gestire): 'touch -d $ (identifica -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f' - gaoithe


È passato molto tempo da quando ho scritto qualsiasi tipo di programma Unix, ma per sbaglio ho 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 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 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 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 usare questo file avresti bisogno di 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
2018-01-04 23:28



Come sopra commento. La maggior parte dei file .jpg avrà data incorporata nei metadati registrati dalla fotocamera. Funziona (usando sed per convertire la data in formato touch in grado di gestire): 'touch -d $ (identifica -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f' - gaoithe


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


-6
2017-11-28 08:37



Snej sta cercando una soluzione batch o a riga di comando che possa essere utilizzata per modificare più file. Cambiare ora e data del sistema e modificare i file non è probabilmente una soluzione ideale. - fabricator4
troppo triiiiiiicky !!! - Philippe Gachoud
Per quelli con altri SO portati qui tramite ricerca web, questa risposta è il modo più semplice per cambiare la data di un file su Mac OSX ('tocco -d' risulta in 'opzione illegale'). - alanning
@alanning: OSX ha un tocco BSD, non GNU touch. Usa -t. developer.apple.com/library/mac/documentation/Darwin/Reference/... - Dominik R
Ciò potrebbe avere conseguenze impreviste. In un sistema operativo moderno, molti file vengono modificati continuamente dietro le quinte. Mentre la tua data è cambiata, molti altri file potrebbero avere impronte di data sbagliate su di loro e tutto può succedere quando qualcos'altro nel sistema nota che un file è più vecchio del previsto. - Joe