linux / shell: zmienić względnie znacznik czasu modyfikacji pliku?

20

Mój aparat tworzy pliki takie jak IMG_1234.JPGi MVI_1234.AVIze znacznikami czasu na tych plikach. Niestety czas nie został ustawiony poprawnie i znaczniki czasu są wyłączone.

Chciałbym ustawić znacznik czasu pliku na dysku. (nie dane EXIF).

Proponowany algorytm:

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

Czy jest na to łatwy sposób? może można uprościć obliczenia, używając czasu epoki (od tamtej pory) i ulepszyć skrypt powłoki.

indeks
źródło
Słowo kluczowe to mtime. Jednak nie znalazłem jeszcze rozwiązania, ponieważ potrzebuję zmiany w stosunku do czasu mtime pliku, a nie bieżącego czasu, jak opisano w unixtutorial.org/2008/11/…
indeks

Odpowiedzi:

38

touch można to zrobić:

 $ 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

Aby zmienić mtime, dodaj --time=mtime

rescdsk
źródło
tak, ale jest to względne w stosunku do twojego aktualnego czasu systemowego, a nie pliku ... dziękuję jednak ...
indeks
1
Kiedy po raz pierwszy odpowiedziałem, tak, ale zredagowałem odpowiedź. Gdy skorzystasz z -r fileopcji, staje się względna do tego pliku. Więc jeśli masz czas na relację z tym samym plikiem, którym manipulujesz, dostajesz to, czego chcesz.
rescdsk
Świetnie, dziękuję. Dokładnie to, czego szukałem.
Artem Russakovskii,
@rescdsk, z ciekawości, jak ta zmiana wpłynie na analizę sądową pliku? jeśli zmodyfikowałeś plik, a następnie ustawiłeś jego datę modyfikacji z powrotem na poprzednią wartość, czy byłoby to możliwe do wykrycia w i-metodzie lub innym metadanych systemu plików? czy dziennikarstwo wpłynęłoby na tę analizę?
Frank Thomas
@FrankThomas, przepraszam, nie mam pojęcia!
rescdsk
11

Łącząc powyższe, jeśli AM / PM się mylił ...

Popraw znaczniki czasu pliku:

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

Następnie zaktualizuj informacje EXIF ​​w plikach jpg do poprawionego znacznika czasu:

$ jhead -dsft *.jpg

Nie zapomnij naprawić ustawienia czasu w aparacie.

Łabędź
źródło
2

iteruje wszystkie pliki w podkatalogu all: użyj stat, aby uzyskać epokę plików / czas uniksowy w sekundach, pozwól dotykowi przeanalizować sumę jako nową datę dla mtime i zapisać do pliku

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

podejście do pythonia patrz /programming/1158076/implement-touch-using-python

indeks
źródło
dla wyjaśnienia, oznacza to, że parser corutil nie tylko akceptuje czasy względne, semantyczne, ale w rzeczywistości może obliczyć! Po prostu wskazując na to, ponieważ nie znalazłem tych informacji w dokumentacji ( gnu.org/software/coreutils/manual/… ) [To tak naprawdę tam: „Względne elementy dostosowują datę (lub bieżącą datę, jeśli nie ma) do przodu lub do tyłu. Efekty względnych pozycji kumulują się. ”]
indeks
2

Robię to samo w OS X, a składnia dotyku jest tu nieco inna.

Ja używam:

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

Spowoduje to dostosowanie + 1 godz. 30 min. 7 s względem pierwotnie zmodyfikowanego czasu. '-013007'za cofnięcie czasu.

osbjmg
źródło
Uwaga dodatkowa: chociaż ta składnia jest lepsza niż nic, jest koszmarem dla skryptów.
tuomassalo
Właśnie tego szukałem (zbyt leniwy, by RTFM: D). Dzięki!
Michele Dall'Agata,
1

Linux, używając touch, aby zmienić ostatnio zmodyfikowany znacznik czasu:

Utwórz plik z datownikiem teraz:

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

Zmień znacznik czasu na 2 godziny temu:

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

Zmień znacznik czasu na 200 godzin temu:

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

Zmień znacznik czasu na 30 dni temu:

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

W przypadku shenanigans ustaw datę ostatniej modyfikacji w przyszłości:

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

Wygląda na to, że będziemy imprezować jak dziś 3012.

Eric Leschinski
źródło
W ostatnim „przyszłym” przykładzie, czy minus ( -) nie mówi dotyku, aby przejść 400 000 dni w przeszłości , a jednak kończy się w przyszłości? A może poczekaj, czy mówisz dotykowi, by podwójnie ujemna data, minus + temu = przyszłość ...? Yar
matey
0

Użyj głowicy:

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

Dostosuj czas przechowywany w nagłówku Exif o h: mm do tyłu lub do przodu. Przydatne w przypadku robienia zdjęć z niewłaściwym czasem ustawionym w aparacie, na przykład po podróży w różnych strefach czasowych lub w przypadku zmiany czasu letniego.

współdziałać
źródło
Dzięki za podpowiedź, jest to podobne do exif i exifTool i jak funkcja digiKam „Dostosuj datę i godzinę” - ale chciałbym zmodyfikować datę systemową pliku. Innym problemem jest to, że mój inteligentny system operacyjny zdaje się w locie przeliczać czas na czas lokalny, a czas letni rozpoczął się w jednej strefie czasowej :-)
indeks