Wissenssammlung
fuer Linux, U.n.i.x, Netzwerke ...
Fachliche Korrektheit ist nicht gewaehrleistet, Vollstaendigkeit eh net..
.
Shellskripten
...
..
.
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
|