linux / shell: ubah timestamp modifikasi file secara relatif?

20

Kamera saya menghasilkan file seperti IMG_1234.JPGdan MVI_1234.AVIdengan cap waktu pada file-file itu. Sayangnya waktunya tidak diatur dengan benar dan cap waktu mati.

Saya ingin mengatur cap waktu file pada disk. (bukan data EXIF).

Algoritma yang diajukan:

1 read file's modify date
2 add delta, i.e. hhmmss (preferred: change timezone)
3 write new timestamp

Apakah ada cara mudah untuk melakukan ini? mungkin orang bisa menyederhanakan perhitungan menggunakan waktu zaman (detik sejak) dan menyiapkan skrip shell.

indeks
sumber
Kata kunci adalah mtime. Namun, saya belum menemukan solusi, karena saya perlu perubahan relatif terhadap waktu file, bukan waktu saat ini seperti yang dijelaskan dalam unixtutorial.org/2008/11/…
index

Jawaban:

38

touch dapat melakukan ini:

 $ ls -l something
-rw-rw-r-- 1 tgs tgs 0 2010-03-22 16:03 something
 $ touch -r something -d '-1 day' something 
 $ ls -l something 
-rw-rw-r-- 1 tgs tgs 0 2010-03-21 16:03 something

http://linux.about.com/library/cmd/blcmdl_touch.htm

Untuk mengubah waktu, tambahkan --time=mtime

rescdsk
sumber
ya, tapi ini relatif terhadap waktu sistem Anda saat ini, bukan file .. terima kasih, meskipun ..
index
1
Ketika saya pertama kali menjawab, ya, tetapi saya mengedit jawabannya. Ketika Anda menggunakan -r fileopsi, itu menjadi relatif terhadap file itu. Jadi jika Anda punya waktu relatif terhadap file yang sama dengan yang Anda manipulasi, Anda mendapatkan apa yang Anda inginkan.
rescdsk
Cemerlang, terima kasih. Persis apa yang saya cari.
Artem Russakovskii
@rescdsk, hanya karena penasaran, bagaimana perubahan ini akan berdampak pada analisis forensik file? jika Anda memodifikasi file, tetapi kemudian mengatur tanggal modifikasi kembali ke nilai sebelumnya, apakah ini dapat dideteksi pada inode atau metadata sistem file lainnya? akankah jurnal berdampak pada analisis ini?
Frank Thomas
@ FrankThomas, maaf, saya tidak tahu!
rescdsk
11

Menggabungkan di atas, jika AM / PM salah ...

Perbaiki waktu perangko file:

#!/bin/sh
for i in all/*; do
  touch -r "$i" -d '-12 hour' "$i"
done

Kemudian perbarui info EXIF ​​dalam file jpg ke cap waktu yang diperbaiki:

$ jhead -dsft *.jpg

Jangan lupa untuk memperbaiki pengaturan waktu di kamera Anda.

Angsa
sumber
2

beralih ke semua file dalam subdirektori semua: gunakan stat untuk mendapatkan file epoch / waktu unix dalam hitungan detik, biarkan sentuh mengurai jumlah sebagai tanggal baru untuk mtime dan menulis ke file

#!/bin/sh
for i in all/*; do
  touch -m -d "$(stat -c %y "$i") + 3600 sec" "$i"
done

untuk pendekatan pythonian, lihat /programming/1158076/implement-touch-using-python

indeks
sumber
hanya untuk memperjelas, ini berarti pengurai tanggal corutil tidak hanya menerima waktu relatif, semantik tetapi sebenarnya dapat menghitung! Hanya menunjukkannya karena saya tidak menemukan informasi itu dalam dokumentasi ( gnu.org/software/coreutils/manual/… ) [Itu sebenarnya ada di sana: "Item relatif menyesuaikan tanggal (atau tanggal saat ini jika tidak ada) maju atau mundur. Efek dari item relatif terakumulasi. "]
index
2

Saya melakukan hal yang sama di OS X, dan sintaks sentuhan sedikit berbeda di sini.

Saya menggunakan:

touch -r "filename" -A '013007' "filename"

Ini akan menyesuaikan + 1 jam 30 menit 7 detik relatif terhadap waktu modifikasi asli. '-013007'untuk mengubah waktu kembali.

osbjmg
sumber
Catatan: sementara lebih baik daripada tidak sama sekali, sintaks ini adalah mimpi buruk untuk skrip.
tuomassalo
Itulah yang saya cari (terlalu malas untuk RTFM: D). Terima kasih!
Michele Dall'Agata
1

Linux, menggunakan sentuhan untuk mengubah stempel waktu terakhir yang dimodifikasi:

Buat file dengan cap waktu sekarang:

el@apollo:~$ touch myfile.txt
el@apollo:~$ ll myfile.txt
-rw-rw-r-- 1 el el 0 Aug 22 09:25 myfile.txt

Ubah cap waktu menjadi 2 jam yang lalu:

el@apollo:~$ touch -d "2 hours ago" myfile.txt
el@apollo:~$ ll myfile.txt
-rw-rw-r-- 1 el el 0 Aug 22 07:25 myfile.txt

Ubah cap waktu menjadi 200 jam yang lalu:

el@apollo:~$ touch -d "200 hours ago" myfile.txt
el@apollo:~$ ll myfile.txt
-rw-rw-r-- 1 el el 0 Aug 14 01:25 myfile.txt

Ubah stempel waktu menjadi 30 hari yang lalu:

el@apollo:~$ touch -d "30 days ago" myfile.txt
el@apollo:~$ ll myfile.txt
-rw-rw-r-- 1 el el 0 Jul 23 09:25 myfile.txt
el@apollo:~$

Untuk shenanigans, tetapkan tanggal modifikasi terakhir di masa mendatang:

el@apollo:~$ touch -d "-400000 days ago" myfile.txt
el@apollo:~$ ll myfile.txt
-rw-rw-r-- 1 el el 0 Oct 21  3012 myfile.txt

Tampaknya, kita akan berpesta seperti 3012 malam ini.

Eric Leschinski
sumber
Untuk contoh "masa depan" terakhir, bukankah minus ( -) memberi sentuhan untuk pergi 400.000 hari di masa lalu , namun itu berakhir di masa depan? Atau tunggu, apakah Anda memberi tahu sentuhan untuk menggandakan tanggal, minus + lalu = di masa depan ...? Yar
matey
0

Gunakan jhead:

http://www.sentex.net/~mwandel/jhead/usage.html

Sesuaikan waktu yang disimpan dalam header Exif dengan h: mm mundur atau maju. Berguna saat mengambil gambar dengan waktu yang salah yang diatur pada kamera, seperti setelah bepergian melintasi zona waktu, atau ketika waktu musim panas berubah.

compie
sumber
Terima kasih atas tipnya, ini mirip dengan exif dan exifTool dan seperti fitur "Sesuaikan Tanggal dan Waktu" digiKam - tetapi saya ingin mengubah tanggal sistem file. Masalah lain adalah bahwa OS pintar saya tampaknya mengubah waktu menjadi waktu lokal dengan cepat dan DST telah masuk dalam satu zona waktu :-)
index