[ cisco89 @ 17.10.2007. 13:48 ] @
Zdravo svima

Imam jedan zadatak koji nikako nemogu da resim:

Pitanje ide ovako

Make a shell script which creates a listing which displays only those files created in <month> and <day> of the parameter list.

Znaci kad se uradi ls -l na linux terminalu treba da se pojave fajlovi sto su napravljeni na <mesec> i <dan>


hvala unapred
[ random @ 18.10.2007. 16:37 ] @
Prvo, pitanje je nebulozno, jer na Unixu (i Linuxu) se ne može saznati kada je fajl kreiran. Može se znati kada je poslednji put promenjen, evo primera za to.

Code:

MONTH=$1
DAY=$2
find . -mtime $(( ( $(date +%s) - $(date -d "$MONTH $DAY" +%s) ) / 86400)) -exec ls -l '{}' \;


Pozoveš sa:

$ ./program Jun 13


To je neka osnovna ideja, proširi po želji.
[ Jbyn4e @ 18.10.2007. 21:44 ] @
Mislim da se tu mislilo na ono vreme koje pise pri ls -l. Najlakse bi bilo:
Code:

# ls - l| grep mesec-dan
tj. za april 12:
# ls - l| grep 04-12
iiliti u skriptu:
# ls - l| grep $1-$2
i poziv skripte sa 
# ./skripta 04 12

(ovo sve ako ne gresim grdno :( )

P.S. Koje vreme se prikazuje uz ls -l? Da li je to modification time, ili access time ili sta?
[ niceness @ 19.10.2007. 00:54 ] @
mtime.
[ random @ 19.10.2007. 14:28 ] @
Ljupče, grešiš grdno :o). Ta ideja nije dobra, a uz to i ne radi. Da li si uopšte probao to što si napisao? Da li uopšte znaš kako tačno izgleda output komande ls -l? Pored toga, šta ako se to što grep-uješ sadrži u imenu fajla? Morao bi da budžiš neki tamo regexp itd. koji ti opet ne bi garantovao ništa. Ako malo razmišljaš u tom pravcu videćeš da je komplikovano da takva budževina bude iole fail safe.

Pored toga, jedno opšte pravilo u programiranju, a koje naravno važi i za skripting: nikad nemoj da se u svom kodu oslanjaš na neku funkcionalnost drugog programa ili biblioteke/API-ja koja nije dobro i strogo definisana. Output komande ls -l nije strogo definisan POSIX-om, i po pravilu ga ne treba nikada parsirati (mada je ovo česta početnička greška).
[ cisco89 @ 19.10.2007. 14:59 ] @
random nazalost skripta neradi

jel ima iko ikakve tutoriale za Osnovno Shell Scriptovanje
[ random @ 19.10.2007. 15:30 ] @
Aj da proverimo.

$ cat >> skripta.sh
MONTH=$1
DAY=$2
find . -mtime $(( ( $(date +%s) - $(date -d "$MONTH $DAY" +%s) ) / 86400 )) -type f -exec ls -l '{}' \;
$ sh skripta.sh oct 15
-rw-r--r-- 1 random users 51 Oct 15 01:08 ./head
-rw-r--r-- 1 random users 12 Oct 15 01:08 ./tail
$


Rekao bih da radi. Eventualno bi trebalo uzeti strožiji kriterijum za mtime koje će find da "hvata" (ako se traži da vreme bude tačno između ponoći željenog datuma i ponoći sledećeg dana). Ovako postoji greška zaokruživanja, nekad će uhvatiti i datum dan pre ili posle željenog.
[ random @ 19.10.2007. 15:37 ] @
Evo i te ispravke, find ima zgodnu opciju -daystart:

Code:
find . -type f -daystart -mtime $(( ( $(date +%s -d "00:00 today") - $(date -d "$1 $2" +%s) ) / 86400 )) -exec ls -l '{}' \;


Što se tiče tutorijala, googlaj "shell scripting", ima ih gomila. Pokušaj za početak da potpuno razumeš razumeš ovu komplikovanu komandu koja rešava tvoj problem, iz nje može dosta da se nauči :). Npr. postavi sebi pitanja: čemu služi $(( ))?, šta radi $( )?, zašto ovo 86400? itd.

[Ovu poruku je menjao random dana 19.10.2007. u 16:48 GMT+1]
[ Jbyn4e @ 19.10.2007. 17:07 ] @
Citat:
random: Ljupče, grešiš grdno :o). Ta ideja nije dobra, a uz to i ne radi. Da li si uopšte probao to što si napisao? Da li uopšte znaš kako tačno izgleda output komande ls -l? Pored toga, šta ako se to što grep-uješ sadrži u imenu fajla? Morao bi da budžiš neki tamo regexp itd. koji ti opet ne bi garantovao ništa. Ako malo razmišljaš u tom pravcu videćeš da je komplikovano da takva budževina bude iole fail safe.

Potpuno si u pravu. Nisam stigao ni da razmislim o tome :) - ali je covek bas pominjao ls -l , pa mi se to nametnulo kao najbrze resenje bez koriscenja find-a. I da, naravno da nisam probao - pisao sam na brznu :*(

Dakle, izgleda da je najbolje random-ovo resenje sa find komandom i njenom exec funkcijom (mada sam je dosad koristio uglavnom za rm -f :) za brisanje fajlova starijih od n dana, meseci...)

P.S. Random, ono so me je ponukalo na ovo je:

~> ls -l
total 3108
drwxr-xr-x 2 xx users 48 2005-09-29 13:45 bin
drwx------ 3 xx users 496 2005-10-07 13:24 Desktop
drwxr-xr-x 2 xx users 80 2005-09-29 13:45 Documents
drwxr-xr-x 3 xx users 72 2005-10-07 13:23 download
...

jer je to izgleda tako definisano da se ispisuje po defaultu kod SuSE-a.