Nowe posty

Autor Wątek: Jak zmodyfikować "change time" pliku?  (Przeczytany 14344 razy)

arctgx

  • Gość
Jak zmodyfikować "change time" pliku?
« dnia: 2008-01-14, 23:36:48 »
Z myślą o wywołaniu find-a z opcją -cnewer zajrzałem do man touch, by zobaczyć jak zmieniać "change time" (celowo nie tłumaczę nazwy tego pola). Potrzebny mi jest po prostu jakiś plik o sztucznie utworzonej dacie, do którego mogę się odwołać.

Okazuje się, że touch-em nie zmienię "change time" (Ed: może i zmienię, ale nie na zadaną przeze mnie :))

Mój doraźny problem rozwiązałem, korzystając z -newer lub -anewer, ale pytanie pozostaje.

Ed2. po wczytaniu się w manuala zauważyłem że wspomniane opcje find-a dotyczą tylko czasu modyfikacji pliku odniesienia. Tak czy tak, chciałbym poznać odpowiedź.

Gdzieś na forach znalazłem desperackie wręcz rozwiązanie, by przestawić zegar systemowy na żądaną datę, zmienić na inne i przywrócić położenia plików, przywrócić aktualny czas. Przesuniętym plikom zmieni się "change time". Zamiast położeń można zmieniać chwilowo prawa dostępu. :)

Naprawdę nie ma w Linuksie prostego polecenia do tej czynności?

norbert_ramzes

  • Gość
Jak zmodyfikować "change time" pliku?
« Odpowiedź #1 dnia: 2008-01-15, 00:22:21 »
Cytat: arctgx
Gdzieś na forach znalazłem desperackie wręcz rozwiązanie, by przestawić zegar systemowy na żądaną datę, zmienić na inne i przywrócić położenia plików, przywrócić aktualny czas. Przesuniętym plikom zmieni się "change time". Zamiast położeń można zmieniać chwilowo prawa dostępu. :)
Stary i znany sposób, ale zastanawia mnie to czemu ktoś taki jak ty na to nie wpadł tylko musiał znaleźć? :) (Bez obrazy...)

Cytat: arctgx
Naprawdę nie ma w Linuksie prostego polecenia do tej czynności?
Nigdy czegoś takiego nie potrzebowałem ale z czystej ciekawości:

ramzes@rh1:~$ echo "test" > plik
ramzes@rh1:~$ ls -l plik
-rw-r--r-- 1 ramzes ramzes 5 2008-01-15 00:04 plik
ramzes@rh1:~$ touch -t 210010100101 plik
ramzes@rh1:~$ ls -l plik
-rw-r--r-- 1 ramzes ramzes 5 2100-10-10 01:01 plik
Cytat: "man touch"
...
Jeśli plik nie istnieje, jest  tworzony (jako  pusty plik z uprawnieniami 0666 zmodyfikowanymi przez umask), chyba że podano opcję -c
...
Chyba o to Ci chodziło?

arctgx

  • Gość
Jak zmodyfikować "change time" pliku?
« Odpowiedź #2 dnia: 2008-01-15, 00:26:57 »
Niestety, nie:
  tmp $ >plik
  tmp $ ls -l plik
-rw-r--r-- 1 arctgx arctgx 0 2008-01-15 00:23 plik
  tmp $ touch -t 200012121111.11 plik
  tmp $ ls -l plik
-rw-r--r-- 1 arctgx arctgx 0 2000-12-12 11:11 plik
  tmp $ stat plik
  File: `plik'
  Size: 0         Blocks: 0          IO Block: 4096   pusty zwykły plik
Device: 303h/771d Inode: 15          Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/  arctgx)   Gid: ( 1000/  arctgx)
Access: 2000-12-12 11:11:11.000000000 +0100
Modify: 2000-12-12 11:11:11.000000000 +0100
Change: 2008-01-15 00:24:11.000000000 +0100
Touch -t zmienia tylko czas dostępu i modyfikacji, a pole Change po zadziałaniu touch-em stało się czasem zmiany tych dwóch :P

PS. Używałem wcześniej touch -t, szukałem też w podręczniku GNU libc i kiszka, przynajmniej dla kogoś, kto nie chce pisać sam programów. :)

Ed: połączenie -t TIMESTAMP z opcją -c też nic nie zdziałało :)

norbert_ramzes

  • Gość
Jak zmodyfikować "change time" pliku?
« Odpowiedź #3 dnia: 2008-01-15, 00:50:55 »
Wygląda na to że jednak nie ma, przynajmniej ja nie znalazłem.

arctgx

  • Gość
Jak zmodyfikować "change time" pliku?
« Odpowiedź #4 dnia: 2008-01-15, 01:01:13 »
To jest właśnie dziwne, dlaczego to podstawowe polecenie nie pozwala na zmianę również tego pola.

xavery

  • Gość
Jak zmodyfikować "change time" pliku?
« Odpowiedź #5 dnia: 2008-01-15, 12:03:24 »
Znacznich "ctime" to znacznik zmiany i-node'a pliku a nie zmiany właściwości pliku. Zatem jeśli zmienimy pozostałe znaczniki za pomocą touch atime i mtime (które rezydują w i-nodzie) to zmieni się także znacznik jego modyfikacji. Sam znacznik czasu modyfikacji i-node'a można zmienić manipulując zawartością i-node'a np uprawnieniami:
$ stat plik
  File: `plik'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 301h/769d       Inode: 1075055     Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/gswitkowski)   Gid: (  100/   users)
Access: 2008-01-15 12:00:06.000000000 +0100
Modify: 2008-01-15 12:00:06.000000000 +0100
Change: 2008-01-15 12:00:06.000000000 +0100
$ chmod `stat -c %a plik` plik
$ stat plik
  File: `plik'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 301h/769d       Inode: 1075055     Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/gswitkowski)   Gid: (  100/   users)
Access: 2008-01-15 12:00:06.000000000 +0100
Modify: 2008-01-15 12:00:06.000000000 +0100
Change: 2008-01-15 12:00:35.000000000 +0100
$
Mam nadzieję, że o to właśnie chodziło

arctgx

  • Gość
Jak zmodyfikować "change time" pliku?
« Odpowiedź #6 dnia: 2008-01-15, 15:53:05 »
OK, to że zmieni się "change time" podczas zmiany praw dostępu czy dwóch pozostałych czasów, to wiem (opisywałem to choćby przy opisie eksperymentu z czasem systemowym).

Ale chciałbym umieć zmienić ten czas nie tyle na narzucony (czyli aktualny systemowy), co na zadany przeze mnie. Zmieniając prawa dostępu dostałeś aktualną godzinę w "change". A nic mi nie wiadomo, by chmod potrafił ustawiać również wprost zadane czasy.

Ed: gdybym miał możliwość zmiany tytułu, dodałbym to "na zadany" do pytania dla ścisłości.

xavery

  • Gość
Jak zmodyfikować "change time" pliku?
« Odpowiedź #7 dnia: 2008-01-15, 16:28:27 »
Cytat: arctgx
Ale chciałbym umieć zmienić ten czas nie tyle na narzucony (czyli aktualny systemowy), co na zadany przeze mnie. Zmieniając prawa dostępu dostałeś aktualną godzinę w "change". A nic mi nie wiadomo, by chmod potrafił ustawiać również wprost zadane czasy.
No tak, tylko zmiana zawartości i-noda na dowolne wartości to już fałszowanie rzeczywistości (nieuzasadniona zmiana znacznika zmiany) zatem nie dziwne, że nie ma takiego narzędzia do zastosowań powszechnych. Tu problem polega na niskopoziomowej edycji struktur filesystemu więc raczej będą to programy z dziedziny hakersko-maniakalnej (wyguglałem Linux Disk Editor- lde). Ewentualnie można się pokusić o samodzielne napisanie programiku przy użyciu bibliotek filesystemu do edycji wartości i-node.

arctgx

  • Gość
Jak zmodyfikować "change time" pliku?
« Odpowiedź #8 dnia: 2008-01-16, 00:32:06 »
To żem wylazł na fałszerza ;). Jakby już wartościować, to i zmianę pozostałych czasów można by uznać za fałszowanie ;)

Program lde, patrząc na podręcznik, nie działa choćby na ext3.

Dzięki wszystkim za poszukiwania, a nim zabiorę się za próby samodzielnej zabawy, minie zapewne nieokreślony kawałek czasu. Może kiedyś jeszcze podłubię w googlu za robotą jakiegoś hakera, wiedząc już, że "i-node" jest dobrym kluczem szukania.

arctgx

  • Gość
Jak zmodyfikować "change time" pliku?
« Odpowiedź #9 dnia: 2008-08-25, 15:28:03 »
Częściowo znalazłem docelowe rozwiązanie. Warto czasem przeglądać angielskie podręczniki zamiast polskich tłumaczeń sprzed paru lat, bo zawierają być informacje o nowościach. Tak też okazało się z podręcznikiem polecenia find.

Od wersji 4.3.3 istnieje opcja -newerXY punkt_odniesienia.

W tym zapisie zamiast X w Linuksie podstawiamy a, c lub m (czasy szukanych plików).

Za Y:

        1. również a, c lub m, jeśli punkt_odniesienia to nazwa pliku. Wtedy podstawiona litera to wybrany czas pliku odniesienia.

        2. t, jeśli punkt_odniesienia to czas w pewnym formacie. Format ten jest zbliżony do tego w poleceniu date, ale chyba nie wszystko da się wrzucić.

Przykład 1 ze strony GNU:
find -newer[color=red]a[/color][color=green]c[/color] /tmp/foo
poszuka w bieżącym katalogu plików, których czas dostępu jest nowszy (po polsku "późniejszy" ;) ) od czasu zmiany (change) pliku /tmp/foo.

Przykład 2:
find -maxdepth 1 -newer[color=red]c[/color][color=green]t[/color] "20080401"
poszuka w bieżącym katalogu (bez zagłębiania się) plików, których czas zmiany nastąpił 1 kwietnia 2008 lub później. Sprawdzić czy działa jak trzeba możemy np. tak:
ls -dlatcr $(find -maxdepth 1 -newerct "20080721")
ls -dlatr $(find -maxdepth 1 -newermt "20080721")
ls -dlatur $(find -maxdepth 1 -newerat "20080721")
Ktoś może zaprotestuje, że find ma opcję -ls, ale mi tak poręczniej i prawdziwy ls nie daje rozbieganych kolumn w mojej konsoli...

Jeśli więc szukamy plików na tej zasadzie, odpada problem grzebania przy "change time".

Nieznane pozostają dla mnie dwie ważne rzeczy.

        Jaki dać format, by z datą została przyjęta godzina (np. coś w rodzaju 200804011408)?

        Jak dodać wprost warunek, że szukany plik ma mieć dany czas zmiany starszy od podanego?

Dokumentację można obejrzeć też tu:
http://www.gnu.org/software/findutils/manual/html_node/find_html/Comparing-Timestamps.html#Comparing-Timestamps

arctgx

  • Gość
Jak zmodyfikować "change time" pliku?
« Odpowiedź #10 dnia: 2009-04-27, 22:47:35 »
Cytat: arctgx
Jaki dać format, by z datą została przyjęta godzina (np. coś w rodzaju 200804011408)?

        Jak dodać wprost warunek, że szukany plik ma mieć dany czas zmiany starszy od podanego?
Przecież to banał: wystarczy odpowiednio z zaprzeczenia skorzystać. Nie wiem, dlaczego wpadłem na to dopiero teraz...
find -maxdepth 1 -newerct "2009-01-25 18:00" ! -newerct "2009-01-31" -ls
Odpowiedzi na oba pytania za jednym zamachem.