Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: Sviccc 23 Října 2011, 01:56:55
-
Potreboval bych poradit se skriptikem.Mam ve slozce soubory ve formatu AB-1110201540-neco.tar.bz2
Jak jde videt, v nazvu je zapsany od zadu cas a datum posledni zmeny souboru.Pomoci skriptu bych chtel vsechny tyto soubory prejmenovat do podoby 20.10.11-15:40-neco.tar.bz2 se zachovanim promenne "neco".Cili skript ktery : precte nazev, ulozi si jednotlive slova do promennych, a nasledne z techto promennych posklada novy nazev.Nakopnul by me nekdo?Dekuji ;-)
-
Ahoj, zkus pouzit programek sed. Umi nahrazovat (substituovat) text podle zadaneho klice. Resil jsem nedavno neco podobneho, koukni se na tahle vlakna:
http://forum.ubuntu.cz/index.php?topic=58584.msg419057 (http://forum.ubuntu.cz/index.php?topic=58584.msg419057) a http://forum.ubuntu.cz/index.php?topic=58085.msg415043 (http://forum.ubuntu.cz/index.php?topic=58085.msg415043) . Snad ti to pomuze, ja jsem pomoci sedu (a kolegu tady z fora) vyresil docela komplikovanou zalezitost - uvidis sam v tech vlaknech :)
-
Ahoj, zkus pouzit programek sed. Umi nahrazovat (substituovat) text podle zadaneho klice. Resil jsem nedavno neco podobneho, koukni se na tahle vlakna:
http://forum.ubuntu.cz/index.php?topic=58584.msg419057 (http://forum.ubuntu.cz/index.php?topic=58584.msg419057) a http://forum.ubuntu.cz/index.php?topic=58085.msg415043 (http://forum.ubuntu.cz/index.php?topic=58085.msg415043) . Snad ti to pomuze, ja jsem pomoci sedu (a kolegu tady z fora) vyresil docela komplikovanou zalezitost - uvidis sam v tech vlaknech :)
Pomoci sedu mi to pripada moc komplikovane, prece jenom potrebuju jen ls --full-time *.bz2 , z toho ulozit do promenne $seste a $sedme slovo, nasledne pomoci mv a promennych zkonstruovat nazev.A samozrejme zasmyckovat.Hlavne nevim, jak ulozit urcite slovo v radce do promenne.Mozna se mylim ? :-)
-
Tak ted mam pocit ze o programovani vis asi o neco vic nez ja... :D
Jak jsem naznacil, nejsem expert ale myslim, ze sed je spis z tech snazsich nastroju, ikdyz ho asi pouzijes jenom jako dilci v nejakem skriptu zhruba podle tveho popisu. Nicmene je mozne, ze na to preformatovani ciselneho kodu na datum nekde najdes uz hotovy sedovsky skript... (nebo treba skript pro awk)
-
No v bashi pisu skriptz prilezitostne a kdyz jednou za cas pisu neco slozitejsiho, vzdy narazim na diru v me neznalosti a potrebuju nakopnout.Rozhodne se ale spise povazuju za zacatecnika.Bodl by nejaky navrh...
-
Skúsil by som to cez Python. Ale tam bude problém, že budeš používať strašne veľa rôznych vecí a z každej len trošku (čo je pravda), ale mal by potom z toho vzniknúť relatívne prehľadný cyklus ;).
Na prechádzanie súborov:
http://docs.python.org/library/os.path.html#os.path.walk
Premenovávanie:
http://docs.python.org/library/os.html#os.rename
Rozloženie mena súboru:
http://docs.python.org/library/re.html
Z hlavy ma napáda niečo takéto:
^AB-(\d+)-.*\.tar\.bz2$
A potom si vytiahnuť potrebnú zátvorku ;).
Ale niečo premakanejšie:
^AB-(?P<year>\d{2})(?P<month>\d{2})(<?P<day>\d{2})(?P<hours>\d{2})(?P<minutes>\d{2})-.*\.tar\.bz2$
V praxi:
re.match(r"^AB-(?P<year>\d{2})(?P<month>\d{2})(<?P<day>\d{2})(?P<hours>\d{2})(?P<minutes>\d{2})-.*\.tar\.bz2$").groupdict()
Práca s časom:
http://docs.python.org/library/datetime.html#datetime.datetime.strftime (formátovanie)
So GL :).
-
Nerikejte mi, ze neexistuje bash varianta ;-)
Nerad bych zacinal jeste s Pythonem, chci v tom mit poradek.
Tak se zeptam jednoduse: jak v bashi vypsat u souboru pouze datum posledni zmeny?
Dekuji ;-)
-
já bych to napsal jaks říkal, naplácat do proměnných a je to
for i in *; do
date=`cut -d"-" -f2` <<< $i`
d=`cut -c 5-6 <<< $date`
m=`cut -c 3-4 <<< $date`
y=`cut -c 1-2 <<< $date`
H=`cut -c 7-8 <<< $date`
M=`cut -c 9-10 <<< $date`
mv $i $d.$m.$y-$H:$M
done
jestli chceš ten datum poslední změny souboru tak
man stat
-
já bych to napsal jaks říkal, naplácat do proměnných a je to
for i in *; do
date=`cut -d"-" -f2` <<< $i`
d=`cut -c 5-6 <<< $date`
m=`cut -c 3-4 <<< $date`
y=`cut -c 1-2 <<< $date`
H=`cut -c 7-8 <<< $date`
M=`cut -c 9-10 <<< $date`
mv $i $d.$m.$y-$H:$M
done
jestli chceš ten datum poslední změny souboru tak
man stat
Takze cut, to jsem potreboval vedet.dekuji moc ;-)
-
Vysledek
- for i in GJ*.dem.bz2; do
rok=`stat --format=%y $i | cut -c 1-4`
mesic=`stat --format=%y $i | cut -c 6-7`
den=`stat --format=%y $i | cut -c 9-10`
cas=`stat --format=%y $i | cut -c 12-19`
mapa=`ls $i | cut -c 18-`
mv $i $den.$mesic.$rok-$cas-$mapa
done
Funguje presne podle mych predstav.Jeste jednou dekuji za ochotnou pomoc pri nakopnuti ;-) :-*