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 02 Října 2009, 17:35:06
-
Takze muj problem je :
Ve slozce /home/sviccc/hltv/ jsou soubory *.dem a kazdy z nich ma cca 11MB.Chtel bych pomoci skriptu kazdy nove vytvoreny soubor *.dem zkomprimovat na *.tar.bz2.Problem je, ze kazdy soubor se vytvori kazdych 20 minut ale uz od prvni minuty je vytvoreny a az po dokonceni nahravani do tohoto souboru se stane kompletnim.Ve skriptovani sem celkem jeste looser, ale nekde se zacit musi a proto dekuji za jakoukoliv odpoved :) :P
-
tady mas muj prasopes co ti vezme vsechny *.dem krome nejnovejsiho. v tom cyklu uz to zabalit a smazt zvladnes, co? trochu snahy, hm?
all=(`ls *.dem --sort=t`); for ((i=1;i<${#all[@]};i++)); do echo ${all[$i]}; done
#popravde ale nevim, co to udela, pokud tam ten *.dem bude jen jeden :D
-
tady mas muj prasopes co ti vezme vsechny *.dem krome nejnovejsiho. v tom cyklu uz to zabalit a smazt zvladnes, co? trochu snahy, hm?
all=(`ls *.dem --sort=t`); for ((i=1;i<${#all[@]};i++)); do echo ${all[$i]}; done
#popravde ale nevim, co to udela, pokud tam ten *.dem bude jen jeden :D
Super... už my to dnes nemyslí... jsem přemýšlel jak rozlišit, že už se dokončilo zapisování... dalo by se nějak ověřit zda daná aplikace běží... nebo se pokusit provést nějakou radikální změnu se souborem (rename, delete), pokud ho má otevřený (lokovaný) jiná aplikace nepůjde to.... a todle je taky chytrý... cash (počet souborů *.dem)... a pokud se objeví nový předposlední se zabalí... sice to je o krok pozadu... ale taky dobrý...
myšlenka principů se rozšiřuje ;)
-
Mockrat diky za plnohodnotnou odpoved ackoliv jsem to jeste nezkousel, ale verim ze to fungovat bude.A i kdyby ne, pro me je to obrovske nasmerovani a tenhle skript si asi zapamatuju navzdy.Takze dnes to zkusim sesmolit a dam vedet jak na tom moje dovednosti jsou :) ale upozornuju ze jsem hracicka a vydrzim si s tim hrat klidne tyden,mesic,rok atd... :)
Takze jeste jednou diky ;)
Jo a jeste jedna otazecka.Co kdyz uz to zabalene bude a spustim znova skript?nezacne to balit ty stare soubory znovu?
-
Jen drobné popostrčení - zkuste
file soubor
na nezkomprimovaný a zkomprimovaný soubor a najděte podstatný rozdíl.
-
@Svicc
chceš ty soubory jenom komprimovat, nebo i házet do archivu (např. tar; archiv slouží k zabalení dat a metadat množiny souborů do jednoho souboru)? Pokud jenom komprimovat, tak použij jenom bzip2 (nebo gzip, nebo lzma). Tyto programy defaultně po vytvoření archivu původní soubor smažou.
ten jeho 'prasopes' vezme jenom *.dem, *.dem.bz2 už ne
@Viper
ty soubory by asi bylo nejjednodušší testovat přes lsof
rename/delete by teoreticky mohl klidně proběhnout, a přitom by program zapisoval dál do nepojmenované inode
-
Yontalcar: wow! lsof je genialni, tudiz staci tomu taru dat exclude na jemne pogrepovanej lsof na aktualnim adresari a je vymalovano, ne? Dik, neznal jsem
-
Tak sem zpet :P
Myslite si, ze takhle by to mohlo fungovat?
#!/bin/bash
cd /home/sviccc/HLTV/cstrike
all=(`ls *.dem --sort=t`); for ((i=1;i<${#all- };i++)); do echo ${all[$i]}; bzip2 *.dem; done
Nejlepsi by bylo vysvetlit mi jednotlivy prikazy v retezci.Pochopil sem z toho akorat: vypsat *.dem,seradit podle data,a nakonec vypsat :D
Ale jak ted koukam tak se to nepovedlo jelikoz mi to zabalilo vse.Potreboval bych nejaky chytry text, kde bych se tohle vsechno docetl.
-
Myslite si, ze takhle by to mohlo fungovat?
#!/bin/bash
cd /home/sviccc/HLTV/cstrike
all=(`ls *.dem --sort=t`); for ((i=1;i<${#all[@]};i++)); do echo ${all[$i]}; bzip2 *.dem; done
...
Ale jak ted koukam tak se to nepovedlo jelikoz mi to zabalilo vse.
Nebude to fungovat, uvědom si, že to nechceš vypsat, ale jenom zkomprimovat, takže to echo nahraď čím potřebuješ
Potreboval bych nejaky chytry text, kde bych se tohle vsechno docetl.
man bash
;)
pokud chceš něco lehčího, tak http://docs.linux.cz/programming/interpreted/bashdoc-1.4/ (http://docs.linux.cz/programming/interpreted/bashdoc-1.4/)
-
No jasne sem to ale vul 8) To me ale mohlo napadnout ze to nechci echovat ale komprimovat :-D
Jen pockejte zajici, za par let tu budu radit ja Vam :-*
Dekuji vsem :-)
-
#!/bin/bash
cd /home/sviccc/HLTV/cstrike
all=(`ls *.dem --sort=t`) #vezmi vsechny *.dem serazeny od nejnovejsiho po nejstarsi
for ((i=1;i<${#all[@]};i++)) #zacni je prochazet (vynech prvni - proto i=1, kdyz nepotrebujes indexy, staci napr for x in y; do echo $y)
do
bzip2 ${all[$i]} #kazdou polozku v sekvenci zabzipuj
done
-
Moment, není to trochu složité? A co mezery v názvech souborů? Nebylo by jednodušší něco jako
find . -type f -name '*.dem' | while read soubor; do bzip2 "$soubor"; done
?
-
Moment, není to trochu složité? A co mezery v názvech souborů? Nebylo by jednodušší něco jako find . -type f -name '*.dem' | while read soubor; do bzip2 "$soubor"; done
?
Neškodilo by, kdybys si přečetl, oc má vlastně tazatel za problém
když už, tak by bylo možné
ls -1 *.dem --sort=t |tail -n +2| while read soubor; do bzip2 "$soubor"; done
a nebo možná
find . -type f -name '*.dem' | while read soubor; do
[ -z "$(lsof "${soubor}")" ]&&bzip2 "$soubor"
done
-
aha, tail me nenapadnul
-
@Viper
ty soubory by asi bylo nejjednodušší testovat přes lsof
rename/delete by teoreticky mohl klidně proběhnout, a přitom by program zapisoval dál do nepojmenované inode
Asi deformace z woken. Tam pokud fopen otevře nějaká aplikace, tak ti to nedovolí smáznout.
-
@Viper
ty soubory by asi bylo nejjednodušší testovat přes lsof
rename/delete by teoreticky mohl klidně proběhnout, a přitom by program zapisoval dál do nepojmenované inode
Asi deformace z woken. Tam pokud pomocí fopen otevře nějaká aplikace soubor, tak ti to nedovolí smáznout.