Forum » Programiranje » [bash] Sortiranje fotografij po datumu
[bash] Sortiranje fotografij po datumu
Mike0 ::
Rabil bi pomoč pri naslednji nalogi:
Ureditev fotografij
Navdušeni fotograf Miha nima časa urejati fotografij, zato jih ima raztresene po vsem disku. Pomagaj mu fotografije urediti po datumu in uri.
Napišite skripto v BASHu, ki poišče vse fotografije (datoteke s končnico jpg (ne razlikujemo med velikimi in malimi črkami) in jih uredi v smiselno drevesno strukturo po letnici in mesecu, datoteko pa preimenuje v format: MMDD-HHMMSS. Podatke o nastanku fotografije preberite iz EXIF informacije (DateTimeOriginal) v sliki s pomočjo orodja exiftool različice 8.60. [20%]
- Uporabnik lahko poda dva argumenta: imenik v katerem se išče fotografije in imenik v katerega se zgradi drevesno strukturo. Če poda samo en argument se predpostavi, da se iskanje začne v trenutnem imeniku. Če ne podamo zadostnega števila argumentov, program javi napako na standardni izhod za napake. Napako izpiše v formatu: Uporaba: ime_programa [SOURCE] DEST. Izhodni status pa je 1. [5%]
- Program naj dejansko preveri, če lahko pišemo v imenik, ki smo ga podali kot ponor, kamor se zapiše drevesna struktura. [2%]
- Datotek dejansko ne premikati ali kopirati, ampak ustvarite samo novo ime, ki kaže na iste podatke. [2%]
- Ker lahko iskanje in obdelava trajata dolgo časa, sproti izpisujte, kateri imenik trenutno pregledujete in za vsako sliko v tem imeniku izpišite ".". Pri izpisu bodite natančni in izpisujete natanko to kar naloga zahteva od vas - do presledka natančno (glejte primer). [10%]
- Uspešno izveden program naj se zaključi z izhodnim statusom 0. [1%]
Primer klica:
$./urediFoto.sh
Uporaba: urediFoto.sh [SOURCE] DEST
$./urediFoto.sh Desktop Pictures
Desktop/card/DCIM/111_PANA/..
Desktop/card/DCIM/110_PANA/.
Desktop/slike/..
Desktop/DCIM/100NCD80/...
Desktop/sneg/.
Stanje v izvorni mapi pred klicem programa:
http://postimg.org/image/i2ybauyg1/
Stanje v ciljni mapi po klicu programa:
http://postimg.org/image/lvuiiihbr/
Slike, ki jih je treba sortirati so tle:
http://www.fileconvoy.com/dfl.php?id=g6...
Ureditev fotografij
Navdušeni fotograf Miha nima časa urejati fotografij, zato jih ima raztresene po vsem disku. Pomagaj mu fotografije urediti po datumu in uri.
Napišite skripto v BASHu, ki poišče vse fotografije (datoteke s končnico jpg (ne razlikujemo med velikimi in malimi črkami) in jih uredi v smiselno drevesno strukturo po letnici in mesecu, datoteko pa preimenuje v format: MMDD-HHMMSS. Podatke o nastanku fotografije preberite iz EXIF informacije (DateTimeOriginal) v sliki s pomočjo orodja exiftool različice 8.60. [20%]
- Uporabnik lahko poda dva argumenta: imenik v katerem se išče fotografije in imenik v katerega se zgradi drevesno strukturo. Če poda samo en argument se predpostavi, da se iskanje začne v trenutnem imeniku. Če ne podamo zadostnega števila argumentov, program javi napako na standardni izhod za napake. Napako izpiše v formatu: Uporaba: ime_programa [SOURCE] DEST. Izhodni status pa je 1. [5%]
- Program naj dejansko preveri, če lahko pišemo v imenik, ki smo ga podali kot ponor, kamor se zapiše drevesna struktura. [2%]
- Datotek dejansko ne premikati ali kopirati, ampak ustvarite samo novo ime, ki kaže na iste podatke. [2%]
- Ker lahko iskanje in obdelava trajata dolgo časa, sproti izpisujte, kateri imenik trenutno pregledujete in za vsako sliko v tem imeniku izpišite ".". Pri izpisu bodite natančni in izpisujete natanko to kar naloga zahteva od vas - do presledka natančno (glejte primer). [10%]
- Uspešno izveden program naj se zaključi z izhodnim statusom 0. [1%]
Primer klica:
$./urediFoto.sh
Uporaba: urediFoto.sh [SOURCE] DEST
$./urediFoto.sh Desktop Pictures
Desktop/card/DCIM/111_PANA/..
Desktop/card/DCIM/110_PANA/.
Desktop/slike/..
Desktop/DCIM/100NCD80/...
Desktop/sneg/.
Stanje v izvorni mapi pred klicem programa:
http://postimg.org/image/i2ybauyg1/
Stanje v ciljni mapi po klicu programa:
http://postimg.org/image/lvuiiihbr/
Slike, ki jih je treba sortirati so tle:
http://www.fileconvoy.com/dfl.php?id=g6...
#!/bin/bash SOURCE="$1" DEST="$2" for f in $(find $1 -iname "*.jpg" -iname "*.JPG") do if [ -f $f ]; then timestamp=$('%[exif:DateTimeOriginal]' $f) y=$(echo $timestamp | cut -c 1-4) m=$(echo $timestamp | cut -c 6-7) d=$(echo $timestamp | cut -c 9-10) ura=$(echo $timestamp | cut -c 12-13) min=$(echo $timestamp | cut -c 15-16) sec=$(echo $timestamp | cut -c 18-19) destFile=$2/$(basename $f) mkdir "$2"; fi cp $f $destFile echo "Moved $f to $destFile" done
Mike0 ::
Tole je najnovejša verzija:
Ne naredi map po datumih in ne naredi novih datotek. Probaj zagnati na linuxu, vrže par napak.
#!/bin/bash SOURCE="$1" DEST="$2" if [ $# -eq 0 ] then echo "Uporaba: $0 [SOURCE] DEST" exit 1 else [ $# -eq 1 ] SOURCE=$(pwd) DEST="$1" fi for f in $(find $1 -iname "*.jpg") do timestamp=$(exiftool -TAG "-DateTimeOriginal" $f) y=$(echo $timestamp | cut -c 1-4) m=$(echo $timestamp | cut -c 6-7) d=$(echo $timestamp | cut -c 9-10) ura=$(echo $timestamp | cut -c 12-13) min=$(echo $timestamp | cut -c 15-16) sec=$(echo $timestamp | cut -c 18-19) if [ ! $dest -w ];do echo napaka exit 1 fi mkdir -p $DEST/$y/$m/ ln -s -f $f "$DEST/$y/$m/$m$d-$ura$min$sec.jpg" done exit 0
Ne naredi map po datumih in ne naredi novih datotek. Probaj zagnati na linuxu, vrže par napak.
kloko ::
exiftool sam omogoča rekurzivno iskanje po drevesni strukturi direktorijev in preimenovanje datotek glede na exif tage v slikah, za ta namen ne rabiš find ukaza.
L.p., Kloko
L.p., Kloko
Mike0 ::
Ob klicu tole izpiše:
mihajlo@mihajlo-Lenovo-G550:~/Desktop/OSDN2$ sh urediFoto.sh Desktop Urejeno
File not found: Desktop/-.jpg
File not found: Desktop/Date/Ti/Tie
No file specified
ln: invalid option -- 'l'
Try 'ln --help' for more information.
File not found: .jpg
Rabim da mi prebere jpg-je in jih razporedi v mape po letih in mesecih, datoteke pa poimenuje MMDD-HHMMSS.jpg
mihajlo@mihajlo-Lenovo-G550:~/Desktop/OSDN2$ sh urediFoto.sh Desktop Urejeno
File not found: Desktop/-.jpg
File not found: Desktop/Date/Ti/Tie
No file specified
ln: invalid option -- 'l'
Try 'ln --help' for more information.
File not found: .jpg
Rabim da mi prebere jpg-je in jih razporedi v mape po letih in mesecih, datoteke pa poimenuje MMDD-HHMMSS.jpg
AndrejO ::
Poskusimo po vrsti...
To ne bo šlo. Poglej si pravilno sintakso za celoten "if" stavek:
Če kličem skripto s samo enim parametrom, to je "kam naj se kopira", kaj bo ta stavek našel? Kje bo iskal?
else [ $# -eq 1 ]
To ne bo šlo. Poglej si pravilno sintakso za celoten "if" stavek:
if list; then list; [ elif list; then list; ] ... [ else list; ] fi
for f in $(find $1 -iname "*.jpg")
Če kličem skripto s samo enim parametrom, to je "kam naj se kopira", kaj bo ta stavek našel? Kje bo iskal?
nokaut240 ::
Z uporabo exiftoola sem uredil slike po mapah, potem se mi pa izpiše tole:
1 directories scanned
5 directories created
9 image files updated
Kako bi to obvestilo onemogočil ?
1 directories scanned
5 directories created
9 image files updated
Kako bi to obvestilo onemogočil ?
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | php array sortiranjeOddelek: Izdelava spletišč | 1184 (907) | Mesar |
» | batch fajl iz txt (strani: 1 2 )Oddelek: Programiranje | 9652 (8313) | b3D_950 |
» | [Bash] Preverjanje legalnosti potiOddelek: Programiranje | 1445 (1072) | piki12 |
» | Bash izpis datotekOddelek: Programiranje | 1461 (1283) | BigWhale |
» | [Linux] izpis ure v lupiniOddelek: Operacijski sistemi | 1153 (912) | kriko1 |