Fórum Root.cz
Hlavní témata => Software => Téma založeno: Michal Švarc 15. 03. 2011, 01:36:00
-
#!/bin/bash
zapis="./zapis.txt";
zapisOld="./zapisOld.txt";
zapisBackUp="./zapisBackUp.txt";
if [ -e "$zapis" ]
then
cp $zapis $zapisOld
rm $zapis
fi
pripony=( avi mkv mp4 wmv divx mpg mpeg )
for ((i=0;i<7;i++))
do
if [ -e "$zapis" ]
then
ls *.${pripony[$i]} >> $zapis 2>/dev/null
else ls *.${pripony[$i]} > $zapis 2>/dev/null
fi
done
while read line
do
# sh ~/Dokumenty/ScriptyBASH/vcs-1.12.2.sh -n 21 -c 3 -H160 "$line"
sleep 1s
echo $line
done <$zapis
cp $zapis $zapisBackUp
rm $zapis
V sekundových intervalech vypisuje jednotlivé řádky ze souboru co si vytvoří, ale když to změním takhle:
...
sh ~/Dokumenty/ScriptyBASH/vcs-1.12.2.sh -n 21 -c 3 -H160 "$line"
sleep 1s
# echo $line
...
spustí se mi daný program jen jednou
-
Nějak nechápu, proč to děláš tak složitě. Zkusím to trochu zjednodušit:
#!/bin/bash
zapis="./zapis.txt";
zapisOld="./zapisOld.txt";
zapisBackUp="./zapisBackUp.txt";
mv "$zapis" "$zapisOld" 2>/dev/null
find . -maxdepth 1 -iname "*.avi" \
-or -iname "*.mkv" \
-or -iname "*.mp4" \
-or -iname "*.wmv" \
-or -iname "*.divx" \
-or -iname "*.mpg" \
-or -iname "*.mpeg" >"$zapis"
while read line; do
sh $HOME/Dokumenty/ScriptyBASH/vcs-1.12.2.sh -n 21 -c 3 -H160 "$line"
sleep 1s
done <"$zapis"
mv "$zapis" "$zapisBackUp" 2>/dev/null
Tohle by mělo fungovat. Proč vlastně vytváříš ty pracovní soubory? Jde to i bez nich.
-
Prvni skript je v bashi a druhy je v cem? Volas tam 'sh', ja bych typoval ze tam taky chces volat 'bash'. Ten shell skript .sh to tedy provede jen jednou? Jaka je navratova hodnota? Co ten skript dela? Provede ho to do konce nebo jen z casti?
Podle me to vypada ze ten skript vrati nenulovou navratovou hodnotu a to tvuj skript ukonci, chtelo by to tohle ve tvem skriptu zakazat, ale ja to umim jen zapnout (set -e), nevim jak to vypnout.
Jinak pro debug doporucuju hned na zacatku bash skriptu napsat 'set -x', hezky to vypisuje ktere prikazy se zrovna provadi.
-
Mam podezreni, ze problem je podobny tomuto: http://www.abclinuxu.cz/poradna/programovani/show/330284
Zkuste presmerovat stdin na /dev/null:
sh $HOME/Dokumenty/ScriptyBASH/vcs-1.12.2.sh -n 21 -c 3 -H160 "$line" < /dev/null
-
Nějak nechápu, proč to děláš tak složitě. Zkusím to trochu zjednodušit:
...
Tohle by mělo fungovat. Proč vlastně vytváříš ty pracovní soubory? Jde to i bez nich.
zjednodušení je fajn a funguje stejně :) - bohužel z nějakého mě neznámého důvodu načítá pouze první řádek - když zakomentuju řádek s sh příkazem a napíšu místo toho "vypsat řádek", tak vypíše všechny
začal jsem s tím takhle (http://forum.root.cz/index.php?topic=1610.msg11555#msg11555).
jednou z možností bylo, zkopírovat ten cyklus mnohokrát, pro každou příponu, což jsem si ale říkal, že to musí jít jinak lépe. Nepodařilo se mi s tím vypořádat bez pracovního souboru (potíže s mezerama), tak to zkouším takhle.
Prvni skript je v bashi a druhy je v cem? Volas tam 'sh', ja bych typoval ze tam taky chces volat 'bash'. Ten shell skript .sh to tedy provede jen jednou? Jaka je navratova hodnota? Co ten skript dela? Provede ho to do konce nebo jen z casti?
Podle me to vypada ze ten skript vrati nenulovou navratovou hodnotu a to tvuj skript ukonci, chtelo by to tohle ve tvem skriptu zakazat, ale ja to umim jen zapnout (set -e), nevim jak to vypnout.
Jinak pro debug doporucuju hned na zacatku bash skriptu napsat 'set -x', hezky to vypisuje ktere prikazy se zrovna provadi.
ten script mi poradili tady (http://forum.root.cz/index.php?topic=1587.msg11404#msg11404)
chceš-li můžeš se na něj podívat tady (http://p.outlyer.net/vcs/files/vcs-1.12.2.bash)
ale i tak, druhý script volá #!/usr/bin/env bash
a výpis se set -x:
miki@ip-94-113-122-100:/Disks/Sdb/Videa> sh ~/Dokumenty/ScriptyBASH/pokus.sh
+ zapis=./zapis.txt
+ zapisOld=./zapisOld.txt
+ zapisBackUp=./zapisBackUp.txt
+ '[' -e ./zapis.txt ']'
+ find . -maxdepth 1 -iname '*.avi' -or -iname '*.mkv' -or -iname '*.mp4' -or -iname '*.wmv' -or -iname '*.divx' -or -iname '*.mpg' -or -iname '*.mpeg'
+ read line
+ sh /home/miki/Dokumenty/ScriptyBASH/vcs-1.12.2.sh -n 21 -c 3 -H160 './video.mkv'
Video Contact Sheet *NIX v1.12.2, (c) 2007-2010 Toni Corvera
Processing ./video.mkv...
Detected video length can't be reached. Safe measuring enabled.
Starting safe length measuring (this might take a while)...
... trying 293.579
Capturing in range [00:13.21-04:37.43]. Total length: 04:53.58
Generating capture #1/21 (00:13.21)...
Very small timestamps in use. Disabling them with -dt might be preferable
Generating capture #2/21 (00:26.42)...
...
Generating capture #21/21 (04:37.43)...
Composing standard contact sheet...
Adding header and footer...
Done. Output wrote to video.mkv-2.png
Cleaning up...
+ sleep 1s
+ read line
+ mv ./zapis.txt ./zapisBackUp.txt
Á zatímco píšu:
Mam podezreni, ze problem je podobny tomuto: http://www.abclinuxu.cz/poradna/programovani/show/330284
Zkuste presmerovat stdin na /dev/null:
sh $HOME/Dokumenty/ScriptyBASH/vcs-1.12.2.sh -n 21 -c 3 -H160 "$line" < /dev/null
je to trochu zvláštní, ale je to tak - no faktem je, že ten vcs script ke své práci volá ffmpeg, nebo mplayer
-
To je teda zajimavy ze to pomohlo, nechapu proc by volany skript v cyklu mel vycist vsechny data z stdin ... :)
No jinak jsem si vsiml jeste jedne veci, to ls *.cokoli na mym stroji vypisuje soubory do nekolika sloupcu vedle sebe, tudiz 1 radek ma vic souboru a neni mozne takovyto vypis cist pres WHILE READ LINE. Ja musim dat ls -1 *.cokoli, aby to psalo kazdy soubor na novy radek, nebo pouzit find.
-
V posledni rade, pokud je jenom nutne vzit seznam souboru a zavolat na nej ten skript, pak se cele to bashovske dlouhe povidani da zkratit na neco jako tohle:
#!/bin/bash
find -regextype posix-egrep -iregex ".*[.](avi|mkv|mp4|wmv|divx|mpg|mpeg)" \
-exec sh $HOME/Dokumenty/ScriptyBASH/vcs-1.12.2.sh -n 21 -c 3 -H160 '{}' \;
To je cele. Otestoval jsem to, funguje to :) Pokud nechces prohledavat podadresare, jeste musis pridat jako parametr pro find neco jako -maxdepth 1
-
No jinak jsem si vsiml jeste jedne veci, to ls *.cokoli na mym stroji vypisuje soubory do nekolika sloupcu vedle sebe, ... nebo pouzit find
ano ls vypisuje do více sloupců, ale když zadáš ls > ls.txt , tak v tom souboru budou každý na novém řádku
ano, find je podle všeho lepší volbou, jistý 'Thomas M' tu dokonce psal cosi (http://forum.root.cz/index.php?topic=1644.0) o nefukčnosti pro enormní počty souborů
#!/bin/bash
find -regextype posix-egrep -iregex ".*[.](avi|mkv|mp4|wmv|divx|mpg|mpeg)" \
-exec sh $HOME/Dokumenty/ScriptyBASH/vcs-1.12.2.sh -n 21 -c 3 -H160 '{}' \;
Tak na tohle zírám a nedostává se mi slov. Díky
-
ano, find je podle všeho lepší volbou, jistý 'Thomas M' tu dokonce psal cosi (http://forum.root.cz/index.php?topic=1644.0) o nefukčnosti pro enormní počty souborů
ohle zírám a nedostává se mi slov. Díky
No to sem byl taky ja, a je to pravda, shell expansion neni vsemocny, pro univerzalnost je lepsi ls *.neco vubec nepouzivat.