diff furcsaság

Fórumok

sziasztok!

van egy ezer éves script, ami egy megadott könyvtárban levő állományok (pontosabban a könyvtár "tartalmi") változását figyeli. igen primitív módon: egy felcicomázot ls paranccsal egy file-ba termeli az állapotot a keresett állományokról és a megadott időben hasonlítja ezt diff segítségével az egyel korábbi állapothoz. legutóbb az alábbi kimenet jött mailben róla:

10c10
< drwxrwxrwx 2 xyz root 4096 szept 13 14:04 file1
---
> drwxrwxrwx 2 xyz root 4096 szept 13 2012 file1

eszerint a nevezett állomány (ami egy mappa) változott. a változás elvben tartalmi változást nem jelentett (akkor további sorok lettek volna a logban), csak a dátum változott. az meg elég furcsán, hiszen mintha egy év telt volna el, holott nem. sőt, a dolog mintha fordítva következett volna be (idén szept 13, 14:40 dátumú állomány hirtelen 2012-es lett volna). a mentésben levőkkel hasonlítva a 2012-es állapot a valós, a fileok tartalma md5 szerint változatlan.

a jelenséget tovább variálja, hogy mindez egy teljesen értelmetlen időben történt, hajnali 4-kor. mintha valamiért hajnalban változott volna valami (user nincs, kérdéses kötet leválasztva munkaidőn kívül, csak a teszt erejéig csatolva).

van valakinek ötlete arra, hogy mi történhetett?

Hozzászólások

a script javítva lesz, nyilván más mód kell, ha ez ilyen. ettől még fura, hogy egy mappa, aminek semmi paramétere (tartalma, timestamp-jei, stb) nem változott, mitől lesz 2-féleképpen listázva, hol így, hol úgy. legalábbis gondolom inkább erre céloztál, mint sima rtfm volt :)

--
xterm

double drupal'd

--
NetBSD - Simplicity is prerequisite for reliability

Ez egy directory, aminek a modositasi datuma azt mutatja, hogy mikor modosult utoljara a tartalma (uj file letrehozasa/file torlese). Nem lehet, hogy egy uj file kerult bele?

Nemreg irtam egy programot, ami a directory mtime-jat es/vagy atime-jat az illeto directoryban levo legujabb file mtime-jara/atime-jara allitja. Ez neked pont jo lenne, osszehasonlitas elott vegigfuttatod a konyvtarakon, es akkor latszik, hogy melyik directoryban milyen datumu a legfrissebb file.

rts-nek is:

A programot magamnak irtam, mert nem talaltam lehetoseget arra, hogy egy konyvtarstruktura minden egyes konyvtaranak a datuma az illeto konyvtarban levo legujabb file datuma legyen - legfokeppen az esztetika miatt, de igy egybol latszik, hogy az illeto konyvtarban melyik a legujabb file (vagy directory). Sokaig a find + touch parossal oldottam meg a dolgot:

touch -r "$(find /path/to/dir -mindepth 1 -maxdepth 1 -printf "%C@;%p\n" | sort -t ";" -k 1 -n -r | head -n 1 | cut -d ";" -f 2)" /path/to/dir

de ez nem mukodik egyes filenevekkel (pl. pontosvesszo vagy newline a file neveben), meg a sok fork miatt sokszorosan (ha jol emlekszem, kb. szazszor) lassabb.

find /path/to/dir -exec touch -r /path/to/dir \{\} \;

Illetve ha csak az adott szinten szeretnéd, és csak a fájlokat, akkor be be lehet vetni (mint a megoldásodban szerepel is) a -maxdepth kapcsolót és a -type f lehetőségét.

Ékezet, szóköz, soremelés nem zavarja, és forkbombának venném.

"csak a dátum változott. az meg elég furcsán"
Erre már fentebb linkeltek dokumentumot, ezen felül a man ls átolvasása is sok információt nyújt, illetve meg lehet ismerkedni a stat paranccsal is.

"eszerint a nevezett állomány (ami egy mappa) változott. a változás elvben tartalmi változást nem jelentett (akkor további sorok lettek volna a logban), csak a dátum változott"
A könyvtár módosult. De ettől még nem biztos, hogy ez látszik az általad nézett időpontban.
Példa:


# ls -ld --time-style full-iso file1
# touch file1/proba ; rm file1/proba
# ls -ld --time-style full-iso file1

Tehát egyideiglenes file létrejötte is tud ilyen jelenséget okozni.

Az ls parancs a hosszú (-l opcióval elérhető) kimenetében a dátumot 2-féle formában szokta írni:

- ha kellően friss a fájl, akkor hónap nap óra:perc formában (első sor a diffben)
- ha nem annyira friss a fájl, akkor hónap nap évszám formában (második sor a diffben)

Ami rohadt zavaró, hogy a "kellően friss" kitételt ritkán dokumentálják hogy mit jelent, én a következőkkel találkoztam eddig:

- az elmúlt egy évben változott (ez itt időtartamot jelent)
- az elmúlt fél évben változott (szintén időtartam)
- ebben az évben változott (ez itt naptári évet jelent, azaz január elsején kb minden "régi" ! )

A fenti listád szerint nálad az ls a 2. pontbeli módszert használja.

(Ami kissé zavaró szokott lenni, hogy a "jövőben változott" fájlok dátumát is a "régi" formában listázza.)

Közel 20 éve írogatok ls parancsokat, de ma sem világos, hogy - bár a szkriptelendő esetek nem kis részében ahol az ember dátummal bíbelődik, ott vissza kell térnie a %s alakhoz - az ls mégsem nyújt ahhoz megjelenítési lehetőséget, vagy elegáns módon nem (GNU: --time-style=+%s).

"idén szept 13, 14:40 dátumú állomány hirtelen 2012-es lett volna"

idén már volt szeptember? :)

nem véletlen írtam így :) ha azt látom egy file-ről, hogy a dátum mellette hó, nap, óra, akkor feltételeztem (eddig), hogy adott éven belüli. most már erre nem hagyatkozom. számomra új volt, hogy ls;ls;ls;ls; szekvencia random elbírálású, tehát statikus adatokat más más pillanatban más formában jelenít meg.

--
xterm

olvasni, olvasni, olvasni ... ;-)

$ man ls | grep -C2 "Hat hónap"

-l, --format=long, --format=verbose

A fájlnevek mellett megadja a fájl típusát, engedélyeit a kemény kötések (hard link) számát, a tulajdonos- és a csoportnevet, a méretet bájtokban és az
időbélyeget, azaz a módosítási időt, hacsak nem más időt választottunk egy másik opcióval. Hat hónapnál régebbi, vagy a jelenleginél több mint egy órával
későbbi idővel rendelkező fájlok esetén az időbélyeg az évet tartalmazza a napon belüli időpont helyett.