Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
S: Seite für Bash Skripte

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Sonstiges
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
malteh



Anmeldungsdatum: 22.08.2004
Beiträge: 1

BeitragVerfasst am: 24. Aug 2004 20:15   Titel: S: Seite für Bash Skripte

Hallo Forum,

kennt Ihr eine Seite wo man Bash Skripte herunterladen kann?


Viele Grüße

Malte
 
Benutzer-Profile anzeigen Private Nachricht senden

Malte H
Gast





BeitragVerfasst am: 24. Aug 2004 22:18   Titel:

Vielleicht könntet Ihr mir einen Tip geben. Ich möchte alle Verzeichnisse ohne Dateien löschen. Das folgende Script tut das schon in etwa. Es gibt aber Probleme wenn in einem Verzeichnis Leerzeichen (Sonderzeichen) vorkommen. Wie kann ich den Befehl
`find "$VERZ" -type d`
so umschreiben das es hier keinen Fehler mehr gibt.


Viele Grüße

Malte

Code:

#!/bin/sh
VERZ=
ANZ=

# Es wird ein Verzeichnis als Parameter erwartet. Wenn nichts angegeben wird pwd genommen.
if [ $# -eq 1 ] ; then
  if [ -d $1 ] ; then
    VERZ=$1
  else
    echo "Parameter ist kein Verzeichnis."
    exit 1
  fi
else
  VERZ=`pwd`
fi

# Alle Verzeichnisse ohne Dateien löschen.
for file in `find "$VERZ" -type d` ; do
  ANZ=`ls -la "$file" | wc -l` 
  if [ $ANZ -eq 3 ] ; then
    echo "$file"
    #rmdir "$file"
  fi
done
 

jochen
prolinux-forum-admin


Anmeldungsdatum: 14.01.2000
Beiträge: 699
Wohnort: Jülich

BeitragVerfasst am: 25. Aug 2004 7:06   Titel:

Die Shell zerlegt den Output des find-Kommandos anhand der Trenner in der Variablen IFS. Deren Inhalt sollte man aber vor dem Ändern sichern und hinterher zurücksetzen.

Ausserdem - wenn schon Leerzeichen in Verzeichnisnamen auftauchen können, solltest Du bei der Prüfung des ersten Arguments "$1" statt nur $1 schreiben.

Wenn Du VERZ auf das aktuelle Verzeichnis setzen willst, kannst Du einfach "VERZ=." statt "VERZ=`pwd`" schreiben. Da steckt der Verzeichnisname zwar nicht ausgeschrieben drin, aber funktionieren tut es genauso.

Wenn Du auf die Anzahl Dateien im Verzeichnis testest (ANZ=`ls -la "$file" | wc -l`), warum verwendest Du dann die Langform (-l) bei ls? Die Infos interessieren Dich doch gar nicht. Ein "ls -a" tut's auch. Lass Dich nicht davon irritieren, dass die Ausgabe dann spaltenweise erfolgt; das passiert nur, wenn ls auf ein Terminal ausgibt. Wenn die Ausgabe so wie hier in eine Pipe erfolgt, erscheint pro Zeile eine Datei. Vorsichtshalber kannst Du ja auch noch die Option "-1" setzen, die dieses Verhalten immer erzwingt. Zu guter Letzt kannst Du dann gegen "Anzahl Dateien == 2" ("." und "..") testen und musst nicht die "total"-Zeile der ls-Langform mitrechnen. Das hatte ich zuerst für einen Fehler gehalten, weil klar war, was Du machen wolltest, die Anzahl vorhandener EInträge in einem leeren Verzeichnis aber 2 sein muss...

Und schliesslich: Wenn ich bei der Entwicklung gefährliche Kommandos wie rmdir entschärfen will, setze ich einfach nur ein echo davor. So sieht man direkt, wie das Kommando ausgeführt werden würde und nicht nur die erarbeiteten Parameter.

So sieht die Variante aus, wo ich alle o.a. Punkte eingebaut habe:
Code:
#!/bin/sh
VERZ=
ANZ=

# Es wird ein Verzeichnis als Parameter erwartet. Wenn nichts angegeben wird pwd genommen.
if [ $# -eq 1 ] ; then
  if [ -d "$1" ] ; then
    VERZ="$1"
  else
    echo "Parameter ist kein Verzeichnis."
    exit 1
  fi
else
  VERZ=.
fi

# Alle Verzeichnisse ohne Dateien löschen.
OIFS="$IFS" ; IFS=""
for file in `find "$VERZ" -type d` ; do
  ANZ=`ls -a "$file" | wc -l`
  if [ $ANZ -eq 2 ] ; then
    echo rmdir "$file"
  fi
done
IFS="$OIFS"

_________________
Die grösste Lüge der EDV? "Mal eben..."
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

Malte H
Gast





BeitragVerfasst am: 25. Aug 2004 10:58   Titel:

Hallo Jochen,

vielen Dank für die Tips.
Jetzt kriege ich den Fehler
/bin/ls: Argument list too long
Vielleicht wäre es besser wenn ich einmal durch alle Verzeichnisse durchgehe. Einzeln...
Unter Linux gab es doch einen Befehl wo man den Pfad eines Komandos herauskriegen konnte. Wie hieß das nochmal?
Kennst Du keine Seite wo man sich Code Schnipsel der Shellprogrammierung ansehen könnte?


Viele Grüße

Malte
 

Tom2
Gast





BeitragVerfasst am: 25. Aug 2004 11:17   Titel:

http://www.linuxfocus.org/Deutsch/September2001/article216.shtml
http://www.fh-wedel.de/~si/vorlesungen/internet/Unix/ShellProg.html
http://www.buch.de/buch/03009/726_unix_shell_programmierung.html
http://www.amazon.de/exec/obidos/ASIN/3827262410/028-0067332-6933309
 

Hans Solo
prolinux-forum-admin


Anmeldungsdatum: 20.04.2004
Beiträge: 601
Wohnort: AT

BeitragVerfasst am: 25. Aug 2004 11:25   Titel:

hi
>> Befehl wo man den Pfad eines Komandos herauskriegen konnte
which <kommando>

mfg
arno
_________________
[root@host]# cd /pub
[root@host]# more beer
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

jochen
prolinux-forum-admin


Anmeldungsdatum: 14.01.2000
Beiträge: 699
Wohnort: Jülich

BeitragVerfasst am: 25. Aug 2004 11:41   Titel:

Sorry, mein Fehler: In IFS muss noch das Newline stehenbleiben, nur TAB und Space dürfen nicht drinne auftreten. Das kommt davon, wenn man etwas mit 'nem anderen Skript testet, als das, was man dann postet...

Verbesserte Fassung:
Code:
#!/bin/sh
VERZ=
ANZ=

# Es wird ein Verzeichnis als Parameter erwartet. Wenn nichts angegeben wird pwd genommen.
if [ $# -eq 1 ] ; then
  if [ -d "$1" ] ; then
    VERZ="$1"
  else
    echo "Parameter ist kein Verzeichnis."
    exit 1
  fi
else
  VERZ=.
fi

# Alle Verzeichnisse ohne Dateien löschen.
OIFS="$IFS" ; IFS="
"
for file in `find "$VERZ" -type d` ; do
  ANZ=`ls -a "$file" | wc -l`
  if [ $ANZ -eq 2 ] ; then
    echo rmdir "$file"
  fi
done
IFS="$OIFS"


Dass Dir aber die argument list platzen kann liegt daran, dass Du mittel `find...` dort den Output des find-Kommandos in die Kommandozeile einsetzen lässt. Wenn das sehr viele Verzeichnisse sind, kann der 32KiB-Buffer der Schell für solchen Zwecke schon mal zu eng sein -> argument list too long.

Probier mal das obige Skript aus und sag Bescheid, ob es das Problem jetzt gelöst hat. Sollte es immer noch krachen, schreiben wir's halt um. Smile

Jochen
_________________
Die grösste Lüge der EDV? "Mal eben..."
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

Malte H
Gast





BeitragVerfasst am: 25. Aug 2004 18:49   Titel:

Vielen Dank Euch allen:-)
Das Skript funktioniert jetzt auch.

Viele Grüße

Malte
 

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Sonstiges Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy