Script Hilfe Bash

Neogreen

Member
Hey,

Ich habe aktuell folgendes Script, nur der Ordner ist 500MB+ Groß und die if abfrage wird nicht ausgelöst wieso?

PHP:
for dir in */; do
(
#echo $dir
size= du $dir | awk '{print $1}'
echo $size
#            512008
if [ "$size" > "500000" ]; then
echo blabla
fi
)
done
 
PHP:
for dir in */; do
size=$(du $dir | awk '{print $1}')
echo $size
if [ "$size" > "500000" ]; then
echo blabla
fi
done
 
PHP:
for dir in */; do
size=$(du $dir | awk '{print $1}')
echo $size
default=500000
if [ "$size" \> "$default" ]; then
echo blabla
fi
done
Kommt das selbe dabei raus, da mir auch die Erfahrung fehlt.
 
Mach das ">" da weg und schreib "-gt" hin. Wenn du ">" nutzen möchtest, wären [[ ]] nötig anstatt [ ] ;)

Code:
for dir in */; do
    size=$(du $dir | awk '{print $1}')
    echo $size
    default=500000
    if [ $size -gt $default ]; then
        echo blabla
    fi
done
 
Code:
for dir in `find ./ -type d -print0 | xargs -0 du | awk '{if ($1 >= 500000) print $2}'`; do something; done


EDIT: Könnte ein Mod diesen Thread bitte passend verschieben, danke.
 
Last edited by a moderator:
Die vorige Version hat einen kleinen Bug, daher bitte diese nehmen:
Code:
for dir in `find ./ -type d -maxdepth 1 -print0 | xargs -0 du -d 0 | awk '{if ($1 >= 500000) print substr($0, index($0,$2))}'`; do something; done
 
Last edited by a moderator:
Die Zeile ersetzt Deinen Code komplett.
Das "something" ersetzt Du durch das, was Du mit "$dir" machen willst, fertig.
Wenn Du nur die Verzeichnisse direkt im aktuellen Verzeichnis bearbeiten willst, fügst Du im find noch ein passendes -maxdepth ein.

EDIT: Ich habe es Dir oben noch eingefügt, so dass nur die Verzeichnisse im aktuellen Verzeichnis gewertet werden.
 
Last edited by a moderator:
Wenn ich solche Scripts sehe, muss ich immer an folgenden Satz denken: "xxx ist ein sehr mächtiges Tool."
 
Last edited by a moderator:
Als fertiges und getestetes Script:
Code:
#!/bin/sh
for dir in $(find ./ -type d -maxdepth 1 -print0 | xargs -0 du -d 0 | awk '{if ($1 >= 500000) print substr($0, index($0,$2))}')
do
 echo $dir
done
find sucht alle Verzeichnisse (-type d) im aktuellen Verzeichnis (-maxdepth 1) und übergibt sie (-print0) per xargs an du. du ermittelt die Grösse der übergebenen Verzeichnisse (-d 0) und gibt die Ausgabe an awk weiter. awk filtert alle Zeilen in deren erster Spalte eine Zahl <500000 auftaucht aus (if ($1 >= 500000) und gibt die restlichen Zeilen aus (print) nachdem die jeweils erste Spalte gelöscht wurde (substr($0, index($0,$2))).

Hoffe das war halbwegs verständlich.


Der für manche Mitleser vielleicht überflüssig erscheinende Aufwand von -print0 und dem substr erklärt sich dadurch, dass Verzeichnissnamen auch Leer- und Sonderzeichen enthalten dürfen. Dieser Aufwand berücksichtigt dies und fällt dadurch nicht auf die Schnauze, wenn solche Zeichen auftauchen.
 
Es funktioniert immer noch nicht.... es gibt es ein ordner worin sich eine 500MB Datei befindet und das script gibt folgnedes aus:
PHP:
./
Normalerweise müsste das Script den Ordnernamen ausgeben, weis jemand Rat?
Danke schonmal für Script.
 
Hast Du das Script auch im richtigen Verzeichnis ausgeführt?
Das Script funktioniert sowohl in Bash als auch in FreeBSDs sh wie gewünscht.
 
Ein kleiner unerwünschter Nebeneffekt war noch drin, nun ist es endgültig Bugfrei:
Code:
#!/bin/sh
basepath="/base/path/"
for dir in "$(find $basepath -type d -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -d 0 | awk '{if ($1 >= 500000) print substr($0, index($0,$2))}')"
do
 echo "$dir"
done
 
Last edited by a moderator:
Back
Top