http://petition.eurolinux.org/







Tux

Wissenssammlung

fuer Linux, U.n.i.x, Netzwerke ...

Fachliche Korrektheit ist nicht gewaehrleistet, Vollstaendigkeit eh net..

.


Shellskripten

...

..

.





Auf dieser Seite werden eine Sammlung von verschiedenen Shellskripten vorgestellt.

files_to_catch.sh

Dieses Skript kopiert eine bestimmte Anzahl an Dateien mit anzugebender 
Mindest- und Maximal-Groesse sowie der Angabe der festgelegten Gesammtgroesse 
in verschiedene Verzeichnisse mit wiederum bestimmter Groesse.

Motivation des ganzen war, eine grosse Anzahl von MP3-Dateien auf 
Verzeichnisse zu verteilen, die dann der jeweiligen Kapazitaet eines Rohlings 
entsprechen(war 'ne Frage in der Liste, ob es ein Programm gibt, dass diese 
Funktionalitaet bereitstellt. Und da ich keines kannte, habe ich halt 
angefangen eines zu schreiben;-)

Zwar ist es noch nicht perfekt, aber fuer den Anfang doch schon mal brauchbar, 
es ist also auch eher als Experimentierwiese fuer verschiedene 
Skriptmoeglichkeiten zu verstehen.

###
Man kann bis jetzt als Argumente uebergeben:

1. die maximale Groesse in k der zu kopierenden Datei(en)

2. die minimale Groesse in k der zu kopierendenDatei(en)

3. die maximale Groesse in k der jeweiligen neuen Verzeichnisse

4. die Gesammtgroesse in k der zu kopierendenDatei(en)

5. die Anzahl der zu kopierenden Datei(en)

6. das Verzeichnis in dem die zu kopierenden Dateien sind

7. das/die Zielverzeichnis/se der zu kopierenden Dateien


### Aufruf###

./files_to_catch.sh 10 1 10 100 100 ~ TEST;

##############



###files_to_catch_v1.2.sh###

#!/bin/bash
#set -x;
clear;
if [ "$#" -ne 7 ] || [ "$1" = "-h" ]; then

        echo "
        "
        echo "files_to_catch.sh - Copyrights 2004 by Thomas Ulrich Nockmann - tun@koeln-lug.de
        "
        echo "Usage: files_to_catch.sh <max sizes of files> <min sizes of files> 
		<sizes of directories> <summary of filesizes> <number of files> <Path to find> <Path to copy to>";
        echo "Example: ./files_to_catch.sh 10 1 10 100 100 ~ TEST;"
        echo "Type './files_to_catch.sh -h' to get this help."
        echo "
        "
        exit;
fi

OK="";
z=1;
for i in $1 $2 $3 $4 $5;do

        OK=`echo $i | gawk '/^[[:digit:]]+/&& !/.*[[:alpha:]]+.*/&& !  /.*[[:punct:]]+.*/ {print "OK";}'`;
        if [ -z "${OK}" ];then
                case $z in 
                        1) NUMBER_OF_ARGUMENT="first";;
                        2) NUMBER_OF_ARGUMENT="second";;
                        3) NUMBER_OF_ARGUMENT="third";;
                        4) NUMBER_OF_ARGUMENT="fourth";;
                        5) NUMBER_OF_ARGUMENT="fifth";;
                esac
                echo "Please put an integer value into the " ${NUMBER_OF_ARGUMENT} " argument.";
                exit;
        fi
        OK=""
        z=`expr $z + 1`
done

#rm -rf TEST;

if [ -d "${7}" ];then
        DECISION="n";
        echo "
        ";
        echo "Directory '$7' exists with tho following contents.";
        ls -Alh "${7}"/*;
        echo "
        ";
        echo "Shell I remove it all and do continue?(y/n)"
        read DECISION
                if [ "${DECISION}" = "y"  ];then
                        rm -rf "${7}"/*
                        echo ""
                else
                        echo "The programm is interrupted by the user."
                        echo "EXIT"
                        exit
                fi
        if [ $? -eq 0 ];then
                cd "${7}"
        fi
else
        DECISION="n"
        echo "
        ";
        echo "Directory '$7' does not exist.";
        echo "Shell I create it?(y/n)"
        read DECISION
        if [ "${DECISION}" = "y"  ];then
                mkdir "${7}"
                if [ $? -eq 0 ];then
                        cd "${7}"
                fi
        else
                echo "The programm is interrupted by the user."
                echo "EXIT"
                exit;
        fi
fi


echo "
";
SUMMARY_OF_FILES=0;
SUMMARY_OF_FILES_FOR_EACH_DIRECTORY=0;
SIZE_OF_FILES=0;
NUMBER_OF_FILES=0;
NUMBER_OF_FILES_TO_GET=$5;
ADD_TO_NUMBER_OF_FILES_ALLOWED="TRUE";
COUNT_FILES=0;
typeset -i MAX_SIZE=$1;
typeset -i MIN_SIZE=$2;
typeset ALLOWED_SIZE_OF_DIRECTORIES=$3;
typeset ALLOWED_SUMMAY_OF_FILES=$4;
ALLOWED_SIZE_OF_DIRECTORIES=`expr $3 \* 1024`
ALLOWED_SUMMAY_OF_FILES=`expr $4 \* 1024`
NEW_DIRECTORIES=0;
        
if [ $((${ALLOWED_SUMMAY_OF_FILES})) -lt $((${ALLOWED_SIZE_OF_DIRECTORIES})) ];then
        echo "Arg 3 has to be greater or equal than Arg 4"
        exit
fi
        
until [  $((${SUMMARY_OF_FILES})) -gt $((${ALLOWED_SUMMAY_OF_FILES})) ]; do 
   echo "
   "
   FOUND_FILES=`find $6 -type f -size -${MAX_SIZE}k -a  -size +${MIN_SIZE}k -maxdepth 1`;
                        
   if [ -z "$FOUND_FILES"  ];then
      echo "No files are found";
      exit;
   else    
      z=0;
      if [ -d 1 ];then
         rm -rf 1
      fi
                
      if [ "${ADD_TO_NUMBER_OF_FILES_ALLOWED}" = "TRUE" ]; then
         for i in $FOUND_FILES;do
            NUMBER_OF_FILES=`expr $NUMBER_OF_FILES + 1`
            #echo $NUMBER_OF_FILES
         done
         ADD_TO_NUMBER_OF_FILES_ALLOWED="FALSE"
      fi
                
      for i in $FOUND_FILES;do
         SIZE_OF_FILE[z]=`ls -l $i|tr -s " "|cut -f 5 -d " "`;
                        
         if [ "$SIZE_OF_FILE" -gt 0 ];then
            SUMMARY_OF_FILES=`expr $SUMMARY_OF_FILES + $((${SIZE_OF_FILE[z]}))`

            if [ $((${SUMMARY_OF_FILES})) -gt $((${ALLOWED_SUMMAY_OF_FILES})) ];then
               echo "SCHLUSS"
               exit ;
            fi

            echo "SUMMARY_OF_FILES" $SUMMARY_OF_FILES
            echo "ALLOWED_SIZE_OF_DIRECTORIES" $ALLOWED_SIZE_OF_DIRECTORIES
            echo "ALLOWED_SUMMAY_OF_FILES" $ALLOWED_SUMMAY_OF_FILES
                                
            SUMMARY_OF_FILES_FOR_EACH_DIRECTORY=`expr $SUMMARY_OF_FILES_FOR_EACH_DIRECTORY + $((${SIZE_OF_FILE[z]}))`
                                
                        
            if [ "${NEW_DIRECTORIES}" -eq 0 ];then  
               NEW_DIRECTORIES=1;
               mkdir $NEW_DIRECTORIES;
                
               if [ $? -eq 0 ];then 
                 cd $NEW_DIRECTORIES;
               else
                  exit
               fi
            fi      
                                
            if [ $((${SUMMARY_OF_FILES_FOR_EACH_DIRECTORY})) -gt $((${ALLOWED_SIZE_OF_DIRECTORIES})) ];then
               cd ..
               mkdir $NEW_DIRECTORIES
               cd $NEW_DIRECTORIES
               echo "Neues Verzeichnis" `pwd`
                                        
	       SUMMARY_OF_FILES_FOR_EACH_DIRECTORY=0;
               NEW_DIRECTORIES=`expr $NEW_DIRECTORIES + 1`
            fi

            echo $i
            cp $i .

            COUNT_FILES=`expr $COUNT_FILES + 1`
                                        
            if [ $((${NUMBER_OF_FILES_TO_GET})) -lt $((${COUNT_FILES}))  ];then
               exit
            else
               if [ $((${COUNT_FILES=`expr $COUNT_FILES - 1`})) -gt $((${NUMBER_OF_FILES}))  ]; then
                  echo "GROESSER"
                  echo $FOUND_FILES
                  exit;
               fi
                                        
               echo "Name der Datei: "$i
               echo "Groesse der Datei: "${SIZE_OF_FILE[z]} "SUMME: "$SUMMARY_OF_FILES "ERLAUBTE GESAMMTGROESSE: "$ALLOWED_SUMMAY_OF_FILES
               echo "NUMBER_OF_FILES: " $NUMBER_OF_FILES
               echo "COUNT_FILES: " $COUNT_FILES

            fi
                                
         else
            echo "TEST"
         fi
                        
         z=`expr $z + 1`
         done
        
   fi
done
###


sort_user.sh

Dieses Skript verwendet die Datei "NUTZER_UNSORTIERT.txt", in der unsortiert u.a. Name stehen.
Grossbuchstabe werden in Kleinbuchstaben umgewandelt und Umlaute & 
SZetts werden entfernt.
Dann werden sie sortiert und schliesslich noch bei identischen Namen 
mit Nummern versehen.

Das alles dauert jedoch uebel lange und ich frage mich, ob man nicht 
schnellere Algorithmen finden kann, vorallem der Bubblesort frist 
Zeit. Bei einem 800/256 dauert der ganze Spass ueber 1 Minute.



###-sort_user.sh-###

#!/bin/bash

#set -x
if [ ! -f /bin/bash ];then
        exit;

fi


clear;
echo "

"




ZAEHLER01=0
ZAEHLER02=0
GROSSBUCHSTABEN=""
KLEINBUCHSTABEN=""
UMLAUTE=""
ZAEHLER_NAME=0


if test -f gruppen.txt;then
        rm gruppen.txt
fi

if test -f NUTZER_UNSORTIERT.TXT;then
        cp NUTZER_UNSORTIERT.TXT benutzer.txt
else
        exit 0;
fi

# Die erste Zeile wird herausgefiltert und der Rest nach puffer01 
gesichert.
sed '/^NAME/d' benutzer.txt > puffer01
mv puffer01 benutzer.txt

# Alle Zeilen, die kein Semikolon enthalten, werden herausgefiltert 
und der Rest nach puffer02 gesichert.
sed '/;/!d' benutzer.txt > puffer02


# Alle Zeilen, die keinen Doppelpunkt enthalten, werden 
herausgefiltert und der Rest nach gruppen.txt gesichert.
sed '/:/!d' benutzer.txt > gruppen.txt

# Die erste Zeile von gruppen.txt wird herausgefiltert und der Rest 
nach puffer01 gesichert.
sed '/^SHELLS/d' gruppen.txt > puffer01


# benutzer.txt und gruppen.txt werden zurueckgesichert.
#cp puffer01 gruppen.txt
#cp puffer02 benutzer.txt
mv puffer01 gruppen.txt
mv puffer02 benutzer.txt

if test -f neuebenutzer.txt;then
        rm neuebenutzer.txt
fi


        for GROSSBUCHSTABEN in A B C D E F G H I J K L M N O P Q R S T U V 
W X Y Z Ä Ö Ü
                do


                        ZAEHLER01=`expr $ZAEHLER01 + 1`



                        for KLEINBUCHSTABEN in a b c d e f g h i j k l m n o p q r s t u 
v w x y z ä ö ü
                                do

                                ZAEHLER02=`expr $ZAEHLER02 + 1`

                if test $ZAEHLER01 -eq $ZAEHLER02
                        then
                                sed  's/'$GROSSBUCHSTABEN'/'$KLEINBUCHSTABEN'/g' benutzer.txt > 
puffer01
                                #echo "Aktueller Grossbuchstabe ist: " "$GROSSBUCHSTABEN"
                                #echo "Aktueller Kleinbuchstabe ist: " "$KLEINBUCHSTABEN" 
#"$ZAEHLER01" "$ZAEHLER02"
                                #echo "Aktueller Zaehler01 ist: " "$ZAEHLER01"
                                #echo "Aktueller Zaehler02 ist: " "$ZAEHLER02"
                                #cat puffer01;
                                if test -f puffer01;then
                                        #cp puffer01 benutzer.txt;
                                        mv puffer01 benutzer.txt;       
                                fi
                                #sleep 1;
                                ZAEHLER02=0
                        break   
                fi

                                done
                done


                        for UMLAUTE in ä ö ü ß
                                do
                                        case $UMLAUTE in
                                        ä) sed 's/ä/ae/g' benutzer.txt > puffer01 ;;
                                        ö) sed 's/ö/oe/g' benutzer.txt > puffer01 ;;
                                        ü) sed 's/ü/ue/g' benutzer.txt > puffer01 ;;
                                        ß) sed 's/ß/ss/g' benutzer.txt > puffer01 ;;
                                        esac
                                        #cp puffer01 benutzer.txt
                                        if test -f puffer01;then
                                                mv puffer01 benutzer.txt
                                        fi
                                        #echo "Aktueller Umlaut ist: " $UMLAUTE;
                                        #sleep 1;
                                done

if test -f puffer01;then
        rm puffer01
fi


if test -f puffer02;then
        rm puffer02
fi
#rm puffer01 puffer02



if test -f benutzer_neu.txt
then
        rm benutzer_neu.txt
fi




COUNT_OF_USERS=`cat benutzer.txt| cut -f1 -d";" |wc -l`

i=1;
COUNT_OF_USERS=`expr $COUNT_OF_USERS + 1`;
COUNT_OF_DELETE=0;

while [ "$i" -lt "$COUNT_OF_USERS" ];do

        if [ `echo $(head -n $i benutzer.txt|tail -n 1|cut -f1 -d 
";") |tr -s " "|cut -f1 -d\; |grep " "|wc -w` -eq 0 ];then
                echo `head -n $i benutzer.txt|tail -n 1|cut -f1 -d 
";"`>>benutzer_neu.txt;
        else
                echo `head -n $i benutzer.txt|tail -n 1|cut -f1 -d 
";"` |tr -s " "|cut -f"${CUT_IT=`echo $(head -n $i 
benutzer.txt|tail -n 1|cut -f1 -d ";") |tr -s " "|cut -f1 -d\; 
|grep " "|wc -w`}" -d " ">>benutzer_neu.txt;
        fi

        i=`expr $i + 1`

        #sleep 1;


done


USER_TO_SORT=`cat benutzer_neu.txt|   cut -f1 -d\;`
COUNT_USER_TO_SORT=0;


for i in $USER_TO_SORT; do
        USER_TO_SORT_ARRAY[COUNT_USER_TO_SORT]=$i;
        USER_TO_CHANGE=$i
        COUNT_USER_TO_SORT=`expr $COUNT_USER_TO_SORT + 1`;
done

NEW_USER_TO_SORT_1=""
NEW_USER_TO_SORT_2=""


SORT_IS_OK="FALSE"
i=0;

while [ $i -lt $COUNT_USER_TO_SORT ];do

        while [ "$SORT_IS_OK" = "FALSE" ]; do

                echo "
                        "
                i_2=`expr $i + 1`
                
                if [ "${USER_TO_SORT_ARRAY[i]}" \< "${USER_TO_SORT_ARRAY[i_2]}" 
];then
                        echo "Benutzer"$i "  heisst: " ${USER_TO_SORT_ARRAY[i]}
                        echo "Benutzer"$i_2 "  heisst: " ${USER_TO_SORT_ARRAY[i_2]}
                        echo "Benutzer"$i "  ist   KLEINER als Benutzer" $i_2
                        SORT_IS_OK="FALSE"

                
                elif [ "${USER_TO_SORT_ARRAY[i]}" \= "${USER_TO_SORT_ARRAY[i_2]}" 
];then
                        echo "Benutzer"$i "  heisst: " ${USER_TO_SORT_ARRAY[i]};
                        echo "Benutzer"$i_2 "  heisst: " ${USER_TO_SORT_ARRAY[i_2]};
                        echo "Benutzer"$i "  ist   GLEICH Benutzer"$i_2
                        SORT_IS_OK="FALSE"


                elif [ "${USER_TO_SORT_ARRAY[i]}" \> "${USER_TO_SORT_ARRAY[i_2]}" 
];then

                        if [ -z "${USER_TO_SORT_ARRAY[i_2]}" ];then
                                echo "Benutzer"$i "  heisst: " ${USER_TO_SORT_ARRAY[i]}
                                echo "Benutzer"$i "  ist der letzte Benutzer!"
                                SORT_IS_OK="TRUE"
                        else

                                echo "Benutzer"$i "  heisst: " ${USER_TO_SORT_ARRAY[i]};
                                echo "Benutzer"$i_2 "  heisst: " ${USER_TO_SORT_ARRAY[i_2]};
                                echo "Benutzer"$i "  ist   GROESSER als Benutzer"$i_2;
                                NEW_USER_TO_SORT_1=${USER_TO_SORT_ARRAY[i_2]};
                                NEW_USER_TO_SORT_2=${USER_TO_SORT_ARRAY[i]};
                                USER_TO_SORT_ARRAY[i]=${NEW_USER_TO_SORT_1};
                                USER_TO_SORT_ARRAY[i_2]=${NEW_USER_TO_SORT_2};
                                i=-1;
                                i_2=0;
                                SORT_IS_OK="FALSE"
                        fi
                fi
                
                

                i=`expr $i + 1` 
                #sleep 1;
        done
        
echo "
        "

        echo $SORT_IS_OK;
        echo "
                "


done

i=0;
i_2=1;

while [ $i -lt $COUNT_USER_TO_SORT ];do

                if [ "${USER_TO_SORT_ARRAY[i]}" \= "${USER_TO_SORT_ARRAY[i_2]}" 
];then
                        USER_TO_SORT_ARRAY[i]=${USER_TO_SORT_ARRAY[i]}$ZAEHLER_NAME;
                        ZAEHLER_NAME=`expr $ZAEHLER_NAME + 1`
                        USER_TO_SORT_ARRAY[i_2]=${USER_TO_SORT_ARRAY[i_2]}$ZAEHLER_NAME;
                        ZAEHLER_NAME=`expr $ZAEHLER_NAME + 1`
                        i=0;
                        i_2=1;
                        sleep 1;
                else
                        i=`expr $i + 1` 
                        i_2=`expr $i_2 + 1`     
                fi
done    

i=0;
while [ $i -lt $COUNT_USER_TO_SORT ];do

                        echo "Benutzer"$i"  heisst: " ${USER_TO_SORT_ARRAY[i]}
                        i=`expr $i + 1` 
done


if test -f benutzer_neu.txt
then
        rm benutzer_neu.txt
fi

exit;
###

###
$cat NUTZER_UNSORTIERT.txt
NAME                    GRUPPE 
Östereich; Ute;         Personal 
Zahlmann; Jetzt;        Lager 
unter den Fichten; Elvira;              Leitung 
Clinton; Hugo;          Leitung 
Dörner; Werner;         Personal 
Förster; Carsten;       Service 
Müller; Uwe;            Technik 
Müller; Willi;          Technik 
Müller; Anna;           Technik 
Müller; Rolf;           Technik 
Gabriel; Günther;       Vertrieb 
Wintersee; Hans;        Admin 
Immer; Johannis;        Technik 
Junghans; Lars;         Lager 
Klugmann; Ilse;         Leitung 
Lindemann-Zöse; Ina;    Personal 
Müller; Ute;            Admin 
Wintersee; Alf;         Admin 
Busch; Arnold;          Admin 
Neumann; Matthias;      Service 
Oppermann; Susanne;     Service 
Pümpel; Ruth;           Technik 
Xyh-Hai; Mhi-Ho;        Service 
Quoos; Peter;           Admin 
Rönner; Dieter;         Service 
Stump; Rüdiger;         Personal 
unter den Tannen; Ludwig;               Leitung 
Unterfang; Ilse;        Personal 
von Kahl; Hans-Dieter;  Technik 
Wintersee; Lars;        Admin 
Förster; Willy;         Service 
Hamann-Fischer; Kai     Vertrieb 
Wintersee; Peter;       Admin 
Yps; Ja;                Technik 
Müller; Paul;           Technik 
Eschweiler; Bruno;      Lager 
Eschweiler; Elke;       Lager 
 
 SHELLS: 
 Personal: bash 
 Technik:  tcsh 
 Admin:    sh 
 Leitung:  bash 
 Vertrieb: csh 
 Lager:    ksh 
 Service:  ksh 
###






Köln LUG
-
die kölner
Linux
und
U.n.i.x
Gruppe

CopyMiddle © 2007 by
Köln LUG - die kölner Linux und U.n.i.x Gruppe