linux / shell: изменить временную метку изменения файла относительно?

20

Моя камера производит такие файлы, как IMG_1234.JPGи MVI_1234.AVIс отметками времени на этих файлах. К сожалению, время не было установлено правильно, а временные метки отключены.

Я хотел бы установить временную метку файла на диске. (не данные EXIF).

Предлагаемый алгоритм:

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

Есть простой способ сделать это? возможно, можно было бы упростить вычисление, используя время эпохи (с тех пор, как секунды), и создать сценарий оболочки.

показатель
источник
Ключевое слово mtime. Однако я пока не нашел решения, так как мне нужно изменить относительное время файла mtime, а не текущее время, как описано в unixtutorial.org/2008/11/…
index

Ответы:

38

touch можно сделать это:

 $ 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

Чтобы изменить mtime, добавьте --time=mtime

rescdsk
источник
да, но это относительно вашего текущего системного времени, а не файла .. спасибо, хотя ..
index
1
Когда я впервые ответил, да, но я отредактировал ответ. Когда вы используете -r fileопцию, она становится относительной к этому файлу. Поэтому, если у вас есть время относительно того же файла, которым вы манипулируете, вы получите то, что хотите.
rescdsk
Блестяще, спасибо. Именно то, что я искал.
Артем Руссаковский
@rescdsk, просто из соображений ясности, как это изменение повлияет на криминалистический анализ файла? если вы изменили файл, но затем вернули дату его изменения к предыдущему значению, будет ли это обнаружено в методах inode или других файловых систем? будет ли журналирование влиять на этот анализ?
Фрэнк Томас
@FrankThomas, прости, я понятия не имею!
rescdsk
11

Объединяя вышесказанное, если AM / PM был неправ ...

Исправьте временные метки файла:

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

Затем обновите информацию EXIF ​​в файлах jpg до исправленной отметки времени:

$ jhead -dsft *.jpg

Не забудьте зафиксировать настройку времени в вашей камере.

лебедь
источник
2

перебирает все файлы в подкаталоге all: используйте stat, чтобы получить время эпохи / unix файлов в секундах, коснитесь, чтобы проанализировать сумму как новую дату для mtime и записать в файл

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

Pythonian подход см. /programming/1158076/implement-touch-using-python

показатель
источник
просто чтобы уточнить, это означает, что синтаксический анализатор даты corutil не только принимает относительное, семантическое время, но и фактически может вычислять! Просто указав на это, поскольку я не нашел эту информацию в документации ( gnu.org/software/coreutils/manual/… ) [Это на самом деле: «Относительные элементы корректируют дату (или текущую дату, если ее нет) вперед или назад. Эффекты относительных предметов накапливаются. "]
index
2

Я делаю то же самое в OS X, и синтаксис touch здесь немного меняется.

Я использую:

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

Это отрегулирует + 1 час 30 минут 7 секунд относительно первоначального измененного времени. '-013007'чтобы повернуть время вспять.

osbjmg
источник
Примечание: хотя этот синтаксис лучше, чем ничего, это кошмар для сценариев.
Туомассало
Это именно то, что я искал (слишком ленив к RTFM: D). Благодарность!
Мишель Далл'Агата
1

Linux, используя touch, чтобы изменить последнюю измененную временную метку:

Создайте файл с отметкой времени сейчас:

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

Измените отметку времени на 2 часа назад:

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

Измените отметку времени на 200 часов назад:

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

Измените отметку времени на 30 дней назад:

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:~$

Для махинаций установите дату последнего изменения в будущем:

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

Видимо, мы будем вечеринкой, как сегодня вечером 3012.

Эрик Лещинский
источник
В последнем «будущем» примере разве минус ( -) не говорит касаться 400 000 дней в прошлом , и все же это заканчивается в будущем? Или подождите, вы хотите сказать, чтобы дважды отрицать дату, минус + назад = будущее ...? Яр матей
Xen2050
0

Используйте jhead:

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

Отрегулируйте время, сохраненное в заголовке Exif, на h: mm вперед или назад. Полезно при съемке с неправильным временем, установленным на камере, например, после путешествий по часовым поясам или при изменении летнего времени.

compie
источник
Спасибо за подсказку, это похоже на exif и exifTool и похоже на функцию «Настроить дату и время» в digiKam, но я бы хотел изменить системную дату файла. Другая проблема заключается в том, что моя интеллектуальная ОС, похоже, на лету конвертирует время в местное время, и DST начинает работать в одном часовом поясе :-)
index