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 6653 krát)

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:[Vyřešeno] Bash - List
« Odpověď #50 kdy: 19 Dubna 2013, 15:44:22 »
du prostě počítá i s velikost adresářů, to jsem ti psal už dřív. Můžeš si hrát i s dalšími příkazy, např:

Kód: [Vybrat]
find -type f -ls | awk '{total += $7} END {print total}'
Tohle spočítá pouze regulérní soubory (rekurzivně), tedy ne symlinky, adresáře a jinou havěť ;)

Edit: jedna uvozovka mi vypadla..
« Poslední změna: 19 Dubna 2013, 16:34:59 od GdH »

Matesax

  • Host
Re:[Vyřešeno] Bash - List
« Odpověď #51 kdy: 19 Dubna 2013, 16:43:56 »
Děkuji - na základě tvého příspěvku jsem zdokonalil svůj kód:

Kód: [Vybrat]
du -b ./* | awk '{total += $1} END {print total}'

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:[Vyřešeno] Bash - List
« Odpověď #52 kdy: 19 Dubna 2013, 17:06:43 »
Tak hlavně nezapomeň na to, že tu hvězdičku ti nahrazuje soubory shell a pokud budeš mít v adresáři jméno s mezerou, skončí to špatně ;)


Matesax

  • Host
Re:[Vyřešeno] Bash - List
« Odpověď #53 kdy: 19 Dubna 2013, 17:08:55 »
Shell jsem si upravil pro Češtinu a tyto případy - escapuji...

Jen mám nyní opačný problém - mezitím co před tím vyšlo číslo moc malé a zacyklilo tak cyklus  :o , nyní naopak vydá moc velké číslo - 127%. Přitom po použití stejných příkazů někde mimo, dosahuji správných hodnot... :)

Kód: [Vybrat]
origin=0

target=0

copied=0

tFiles=`ls tmp`
all=false

for f in done/*
do
getSize $f

origin=$(($origin + $ret))

if [[ $csys == false ]]
then

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`
else
getSize tmp/`basename $f`

target=$(($target + $ret))
fi
elif [[ $tFiles == *`basename $f`* ]]
then
rm tmp/`basename $f`
fi
fi
done

cp done/* tmp &

while [ $origin -gt $copied ]
do
copied=$((`du -bc tmp/* | tail -1 | sed -e 's/\s.*//'` - $target))
pct=$((100 * $copied / $origin))

echo -en "\r>>> Progress: ${pct}%\r"
sleep 1
done

echo ">>> Unmounting the target device..."

umount tmp

A větší problém - bez sleep se nestihne dokončit kopírování - cyklus ale skončit dříve nesmí. Proč tedy skončí?
Děkuji.
« Poslední změna: 19 Dubna 2013, 17:13:17 od Matesax »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:[Vyřešeno] Bash - List
« Odpověď #54 kdy: 19 Dubna 2013, 17:34:07 »
Pokud blbě počítáš, tak asi může skončit dřív. Pokud chceš odpojovat zařízení, měl bys počkat na sync, je tu taky cache, pokud nenamountuješ v synchroním režimu, ....

 

Provoz zaštiťuje spolek OpenAlt.