Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: [Vyřešeno] Bash - List  (Přečteno 5801 krát)

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #25 kdy: 16 Dubna 2013, 20:37:56 »
Tak už jsi na to přišel?

Matesax

  • Host
Re:Bash - List
« Odpověď #26 kdy: 16 Dubna 2013, 20:51:57 »
Jsem schopen dostat velikost v bytech o něco snadněji, ale prostě se to zasekne...

Kód: [Vybrat]
getDirSize()
{
list=`du -sb "${path}/${1}"`
ret=`echo $list | sed -e 's/\s.*//'`
}

getDirSize "done"

origin=$ret

getDirSize "tmp"

target=$ret

copied=0

cp done/* tmp &

while [ $origin > $copied ]
do
getDirSize "tmp"
copied=$(($ret - $target))
pct=$((100 * $copied / $origin))

echo -en ".$pct%\b\b\b"
sleep 1
done

Napadá mne jen, že cyklus kopírování přeruší... Což by nastavení do pozadí podle mě mělo vyvrátit - ale neděje se nic... Respektive byty nepřibývají a tak se cyklus neukončí.
« Poslední změna: 16 Dubna 2013, 20:55:29 od Matesax »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #27 kdy: 16 Dubna 2013, 21:45:54 »
Podívej se jak se v bashi porovnávají čísla.

Kód: [Vybrat]
path=`pwd -P`
getDirSize()
{
        ret=`du -sb "${path}/${1}"|sed 's/\s.*//'`
}

getDirSize "done"
origin=$ret
getDirSize "tmp"
target=$ret

copied=0

cp done/* tmp &

while [ $origin -gt $copied ]
do
        getDirSize "tmp"
        copied=$ret
        pct=$((100 * $copied / $origin))

        echo -en "\b\b\b.$pct%"
        sleep 1
done


Matesax

  • Host
Re:Bash - List
« Odpověď #28 kdy: 16 Dubna 2013, 21:48:00 »
Mělo by jít i to s operandem... Každopádně to s optionem dá:

Kód: [Vybrat]
./install: řádek 121: [: -qt: očekáván binární operátor

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #29 kdy: 16 Dubna 2013, 21:51:32 »
Už konečně používáš Bash? Já ano a ten kód jsem testoval. Jinak stále používáš své doměnky, místo aby sis ověřoval fakta. Operátory, na které jsi zvyklý, se v Bashi používají jen na porovnávání řeťezců.

Matesax

  • Host
Re:Bash - List
« Odpověď #30 kdy: 16 Dubna 2013, 21:57:30 »
Kdybych nepoužíval Bash, nejela by ta část před tím... Už jsem posílal novou hlavičku souboru... Je hezké, že tobě to jde, ale mě ne... :)

Kód: [Vybrat]
path=`pwd -P`

getDirSize()
{
list=`du -sb "${path}/${1}"`
ret=`echo $list | sed -e 's/\s.*//'`
}

Neřídím se domněnkami, ale:

http://tldp.org/LDP/abs/html/comparison-ops.html
getDirSize "done"

origin=$ret

getDirSize "tmp"

target=$ret

copied=0

cp done/* tmp &

while [ $origin -qt $copied ]
do
getDirSize "tmp"
copied=$(($ret - $target))
pct=$((100 * $copied / $origin))

echo -en ".$pct%\b\b\b"
sleep 1
done

Neřídím se domněnkami, ale:

http://tldp.org/LDP/abs/html/comparison-ops.html
« Poslední změna: 16 Dubna 2013, 22:01:37 od Matesax »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #31 kdy: 16 Dubna 2013, 22:01:10 »
Já ale píšu o kódu, který jsem vložil já, ten tvůj jsem ani nezkoušel.

Matesax

  • Host
Re:Bash - List
« Odpověď #32 kdy: 16 Dubna 2013, 22:02:26 »
Joo - mám tam sice qt místo gt, ale gt mi zase stagnuje - nic se neděje - kód se zacyklí...
« Poslední změna: 16 Dubna 2013, 22:04:55 od Matesax »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #33 kdy: 16 Dubna 2013, 22:06:01 »
Podívej se na ten cyklus pořádně.

Matesax

  • Host
Re:Bash - List
« Odpověď #34 kdy: 16 Dubna 2013, 22:09:02 »
Ale to je přeci blbost - já musím anulovat dosavadní velikost cílové složky - chci dostat jen přírůstek... Jak to mám teď - zjistím si velikosti složek zdrojové a cílové. Začnu kopírovat a v cyklu se ptám na velikost cílové - velikost cílové před kopírováním...

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #35 kdy: 16 Dubna 2013, 22:18:20 »
Dělej si to jak chceš, mně to prostě ukazuje od nuly do sta procent a pak to skončí jak má.

Matesax

  • Host
Re:Bash - List
« Odpověď #36 kdy: 16 Dubna 2013, 22:27:35 »
Mě se ale prostě nezmění velikost - ta před a po je stejná... To proto se to zacyklí... Může hrát roli, že cílem je USB? Tedy namountovaný sdb do složky?

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #37 kdy: 16 Dubna 2013, 22:37:09 »
Rozhodně by to nemělo být důvodem zacyklení, zásadnější rozdíl je jen v tom, že usb je pomalejší a hraje daleko větší roli cache. Nejsem si teď jist, jak přesně funguje du, ale je jisté, že cp skončí dříve, než jsou data skutečně fyzicky na disku.

Matesax

  • Host
Re:Bash - List
« Odpověď #38 kdy: 16 Dubna 2013, 22:44:52 »
Nechal jsem cyklus běžet 5 minut - tak to už nevysvětlíš... :) Velikost se prostě za běhu scriptu nezměnila...

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #39 kdy: 16 Dubna 2013, 23:03:51 »
Napadlo tě zjistit si velikosti, které jsou porovnávány, jaký je konečný rozdíl? Jakou velikost má prázdný adresář?

Na mém systému:

Kód: [Vybrat]
path=`pwd -P`
getDirSize()
{
        ret=`du -sb "${path}/${1}"|sed 's/\s.*//'`
}

getDirSize "done"
origin=$ret
getDirSize "tmp"
target=$(($ret-4096))
copied=0

cp done/* tmp &

while [ $origin -gt $copied ]
do
        getDirSize "tmp"
        copied=$(($ret-$target))
        pct=$((100 * $copied / $origin))

        echo -en "\b\b\b$pct%"
        sleep 1 
done
echo
« Poslední změna: 16 Dubna 2013, 23:05:33 od GdH »

Matesax

  • Host
Re:Bash - List
« Odpověď #40 kdy: 17 Dubna 2013, 05:51:33 »
Tak to mi neuvěříš... :) Já už jsem před tím testoval instalaci - ony soubory už tam byly... I tak se to zasekne na 96 procentech - tuším, že bude problém v samotné složce...

Matesax

  • Host
Re:Bash - List
« Odpověď #41 kdy: 17 Dubna 2013, 07:09:57 »
Já to snad nedám do kupy... :)

Kód: [Vybrat]
for f in done/*
do
if [[ $tFiles == *`basename $f`* && $all == false ]]
then
echo ">>> The target device already contains files from Done directory...";
echo ">>> Overwrite it? (all/y/n)"

read overwrite

if [ "$overwrite" = "y" ]
then
rm tmp/`basename $f`
elif [ "$overwrite" = "all" ]
then
all=true
rm tmp/`basename $f`
fi
elif [[ $tFiles == *`basename $f`* ]]
then
rm tmp/`basename $f`
else
getDirSize tmp/`basename $f`

target=$(($target - $ret))
fi
done

cp done/* tmp &

while [ $origin -gt $copied ]
do
getDirSize "tmp"
copied=$(($ret - $target))
pct=$((100 * $copied / $origin))
echo $target
echo -en ".$pct%\b\b\b"
sleep 1
done

Nyní vezmu počáteční velikost cílové složky a od ní odečítám ty soubory, které uživatel nechce smazat. Ostatní se smažou - a tak je třeba jejich velikost odečíst od target, jelikož o target pak budu snižovat velikost zkopírované části... Pak když kopíruji, tak to hodí prvně 76% a někdy 96%, ale pak už zase 0 a zacyklí se to...
« Poslední změna: 17 Dubna 2013, 07:12:36 od Matesax »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #42 kdy: 17 Dubna 2013, 10:56:04 »
Mně to tu už nebaví ;)

cp kopíruje všechny soubory a je jedno, zda tam už jsou, nebo ne.
Pokud tedy počítáš s tím, že tam jsou nějaké stejné soubory, přinejmenším jménem, musíš je předem smazat, nebo je vůbec nekopírovat a zohlednit to ve výpočtech. Kopírovat je přes a spoléhat se na to, že jsou stejné velikosti není zrovna moudré a rozhodně bys nemohl sledovat průběh kopírování porovnáváním velikosti před a po.
Ve smyčce musíš porovnávat relevantní data, což zahrnuje i odečtení velikosti samotného adresáře od dat, která jsou v něm uložena, protože ten rozdíl, který vypočítáš z aktuální velikosti cílového adresáře oproti původní, adresář logicky nezahrnuje.

Matesax

  • Host
Re:Bash - List
« Odpověď #43 kdy: 17 Dubna 2013, 16:00:37 »
Co píšeš jsem přesně udělal - shodné soubory se smažou pokud to uživatel povolí... Odečítám jen zbylé soubory...

Dále cp nepřepisuje soubory, jen s optionem f. A jde logicky o to, že když jsem vzal původní velikost a soubory se jen přepsaly (nebo vůbec nekopírovaly), tak se výsledná velikost nezměnila...
« Poslední změna: 17 Dubna 2013, 16:02:33 od Matesax »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #44 kdy: 17 Dubna 2013, 16:16:34 »
Takže hotovo? :)

Matesax

  • Host
Re:Bash - List
« Odpověď #45 kdy: 17 Dubna 2013, 16:59:28 »
Právě, že to nefunguje... Jak jsem psal - vypíše to 76%, či 96% a pak opět 0 a zacyklí se to...

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #46 kdy: 17 Dubna 2013, 17:40:30 »
Úloha je to dostatečně triviální, aby nebyl problém vystopovat důvod chování tvého skriptu. Co jsem sem vložil a napsal, to jsem si ověřil empiricky a všechno sedí a funguje, moje počítadla problém nemají flaška neflaška. Teď už je to na tobě.

Matesax

  • Host
Re:Bash - List
« Odpověď #47 kdy: 19 Dubna 2013, 07:28:55 »
Tak ta úloha zase tak triviální není... :) Už jsem našel problém - velikost souborů je sice stejná, ale užití na disku jiné. DU očividně měří velikost na disku. Jak tedy dostat velikost souborů?

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #48 kdy: 19 Dubna 2013, 08:42:19 »
Tak triviální, abys na tento fakt přišel do pěti minut  ;)

Matesax

  • Host
Re:Bash - List
« Odpověď #49 kdy: 19 Dubna 2013, 15:24:49 »
Joo - du jsem nakonec použil - ale s /*, místo velikosti mateřské složky... Bůh ví, co budu dělat až tam budou subsložky... To si to rovnou napíši do bootloaderu a bude... :) Tedy abych nebyl prase, udělám to raději zvlášť... :) Každopádně děkuji.

 


Provoz zaštiťuje spolek OpenAlt.