Pertanyaan Bagaimana saya bisa mengubah tanggal yang diubah / dibuat dari sebuah file?


Apakah ada cara untuk mengubah tanggal ketika file diubah / dibuat (yang ditampilkan dalam Nautilus atau dengan perintah ls-l)? Idealnya saya mencari sebuah perintah yang dapat mengubah stempel tanggal / waktu dari sejumlah besar file ke sejumlah waktu tertentu sebelum atau sesudahnya (mis. +8 jam atau -4 hari dll.).


192
2017-09-22 05:32


asal




Jawaban:


Anda dapat mengubah waktu modifikasi file menggunakan touch perintah:

touch filename

Secara default ini akan mengatur waktu modifikasi file ke waktu saat ini, tetapi ada sejumlah flag, seperti -d bendera untuk memilih tanggal tertentu. Jadi misalnya, untuk mengatur file sebagai yang dimodifikasi dua jam sebelum sekarang, Anda bisa menggunakan yang berikut:

touch -d "2 hours ago" filename

Jika Anda ingin memodifikasi file relatif terhadap waktu modifikasi yang ada, berikut ini harus melakukan trik:

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

Jika Anda ingin memodifikasi sejumlah besar file, Anda bisa menggunakan yang berikut:

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

Anda dapat mengubah argumen menjadi find untuk memilih hanya file yang Anda inginkan. Jika Anda hanya ingin memperbarui waktu modifikasi file relatif terhadap waktu sekarang, Anda dapat menyederhanakannya menjadi:

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

Formulir ini tidak mungkin dengan file waktu relatif versi karena menggunakan shell untuk membentuk argumen touch.

Sejauh waktu pembuatan, kebanyakan sistem file Linux tidak melacak nilai ini. Ada sebuah ctime terkait dengan file, tetapi melacak ketika metadata file terakhir diubah. Jika file tidak pernah berubah izinnya, mungkin terjadi untuk menahan waktu pembuatan, tetapi ini adalah kebetulan. Secara eksplisit mengubah waktu modifikasi file dihitung sebagai perubahan metadata, sehingga juga akan memiliki efek samping memperbarui ctime.


259
2017-09-22 06:34



Untuk menyebutkan kasus yang lebih sederhana ketika semua file berada di folder yang sama: touch -d "2 hours ago" /path/*.txt, sebagai contoh. - enzotib
Saya juga menambahkan bahwa mengubah ctime tidak mungkin dengan cara standar apa pun. - arrange
Apakah ini semua POSIX? - user1011471
Informasi tentang ctime sebagai waktu perubahan metadata adalah dari POSIX. Saya tidak tahu apakah fragmen shell dalam jawaban saya akan bekerja dengan utilitas shell POSIX yang ketat. Tetapi mereka pasti bekerja di Ubuntu, yang merupakan konteks untuk jawaban di situs ini. - James Henstridge
touch: illegal option -- d - User


Terima kasih untuk bantuannya. Ini berhasil untuk saya:

Di terminal, buka direktori untuk mengedit tanggal. Kemudian ketik:

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

Anda akan melihat ">" setelah Anda menekan enter, keluarkan untuk terakhir kalinya -> "selesai".

catatan:  Anda mungkin ingin mengubah "201203101513"

"201203101513" = adalah tanggal yang Anda inginkan untuk semua file dalam direktori ini.

Lihat halaman web saya


40
2018-03-10 14:21



tidak berfungsi seperti yang diharapkan jika nama file berisi ruang kosong - Angel


Cara termudah - diakses dan dimodifikasi akan sama:

touch -a -m -t 201512180130.09 fileName.ext

Dimana:

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

Jika Anda ingin menggunakannya NOW hanya menjatuhkan -t dan stempel waktu.

Untuk memverifikasi semuanya sama: stat fileName.ext

Lihat: sentuh manusia


22
2017-12-19 14:58



Saya mencoba untuk memverifikasi menggunakan stat, tetapi tidak ada touch bendera mengarah ke hasil yang benar. Tanggal modifikasi disesuaikan, tetapi tanggal yang diubah dan diakses sebenarnya diubah menjadi SEKARANG - Xerus


Sentuh dapat mereferensikan tanggal file dengan sendirinya, tidak perlu dihubungi date atau gunakan substitusi perintah. Ini sedikit dari halaman info sentuhan:

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

Misalnya, untuk menambahkan 8 jam ke tanggal file (nama file dari file dikutip hanya dalam kasus ruang, dll):

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

Menggunakan loop di atas semua file di direktori saat ini:

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

Saya pernah mendengar bahwa menggunakan * dan membiarkan for pilih nama file itu sendiri lebih aman, tetapi menggunakan find -print0 | xargs -0 touch ...  harus ditangani paling karakter gila seperti baris baru, spasi, tanda kutip, backslash dalam nama file. (PS. Cobalah untuk tidak menggunakan karakter gila dalam nama file di tempat pertama).

Misalnya, untuk menemukan semua file di thatdirnama file yang dimulai dengan s, dan tambahkan satu hari ke stempel waktu yang dimodifikasi file tersebut, gunakan:

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

6
2017-12-17 14:52





Naskah kecil ini setidaknya bekerja untukku

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



Menyesuaikan tanggal gambar berdasarkan info meta dalam gambar akan sangat berguna. Identifikasi ImageMagick dapat digunakan. misalnya 'identifikasi -verbose <image> | grep -i date', 'identifikasikan -format% [exif: DateTime] <image>' mungkin menunjukkan '2015: 01: 08 10:19:10' (tidak semua gambar memiliki data exif) . Ini berfungsi (menggunakan sed untuk mengkonversi tanggal untuk memformat sentuhan dapat menangani): 'touch -d $ (identifikasikan -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f' - gaoithe


Sudah lama sejak saya menulis segala jenis program Unix, tapi saya tidak sengaja mengatur tahun dengan salah pada banyak foto Natal, dan saya tahu jika saya tidak mengubah tanggal dari 2015 hingga 2014, itu akan menjadi masalah di kemudian hari. .

Mungkin, ini adalah tugas yang mudah, tetapi saya tidak menemukan cara sederhana untuk melakukannya.

Saya memodifikasi skrip yang saya temukan di sini, yang awalnya digunakan untuk mengubah tanggal dengan minus satu bulan.

Berikut skrip aslinya:

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

Berikut skrip modifikasi saya yang memaksakan tanggal ke tahun "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

Sekarang saya menyadari saya bisa melakukan versi yang lebih umum:

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

Untuk menggunakan file ini, Anda perlu menulisnya dan

chmod +x fn

untuk mengeksekusi:

./fn files-to-change

fn = nama-file-mu-itu-adalah-perintah-mu

Contoh

./fn *.JPG

akan mengubah tanggal dengan minus satu tahun di direktori tempat Anda berada.


1
2018-01-04 23:28



Sama seperti komentar di atas. Sebagian besar file .jpg akan memiliki tanggal yang disematkan dalam data meta yang dikuasai oleh kamera. Ini berfungsi (menggunakan sed untuk mengkonversi tanggal untuk memformat sentuhan dapat menangani): 'touch -d $ (identifikasikan -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f' - gaoithe


ubah saja tanggal dan waktu di pengaturan. kemudian simpan file Anda, secara otomatis berubah


-6
2017-11-28 08:37



Snej mencari solusi batch atau command line yang dapat digunakan untuk memodifikasi banyak file. Mengubah waktu dan tanggal sistem dan memodifikasi file mungkin bukan solusi ideal. - fabricator4
terlalu banyak triiiiiiicky !!! - Philippe Gachoud
Bagi mereka dengan OS lain yang dibawa ke sini melalui penelusuran web, jawaban ini adalah cara termudah untuk mengubah tanggal file di Mac OSX (hasil 'sentuh -d' dalam 'opsi ilegal'). - alanning
@alanning: OSX memiliki sentuhan BSD, bukan sentuhan GNU. Gunakan T. developer.apple.com/library/mac/documentation/Darwin/Reference/… - Dominik R
Itu mungkin memiliki konsekuensi yang tak terduga. Dalam OS modern, banyak file yang dimodifikasi di belakang layar sepanjang waktu. Saat tanggal Anda diubah, banyak file lain yang bisa salah stempel tanggal pada mereka dan apa pun bisa terjadi ketika sesuatu yang lain dalam sistem mengetahui bahwa file lebih lama dari yang diharapkan. - Joe