risc2000
Goto Top

Datei zeilenweise in einem Bash Script verarbeiten

Hallo, ich möchte in einem Verzeichnis rekursiv alle Unterverzeichnisse in einer Liste speichern. Anschließend möchte ich diese Liste "abarbeiten", in dem ich in jedes Unterverzeichnis wechsel und dort entsprechende Befehle ausführe. Als Ansatz habe ich folgendes Bash Script, was mir aber bei der Zeile: cd $_DIR fogenden Fehler bring: "Zugriff auf ... nicht möglich: Datei oder Verzeichnis nicht gefunden"

Ich finde den Fehler nicht, die Verzeichnisse existieren. Manuell geht es auch mit cd /gehe/in/das/entsprechende/verzeichnis


Vielen Dank, schonmal.


[code]
#!/bin/bash

#! Verzeichnisliste erzeugen
find -type d | cut -c 2-512 > $DIRLIST

#! Verzeichnisliste zeilenweise einlesen
for _DIR in `$DIRLIST` ; do

#! In das Aktuelle Verzeichniss gehen
cd $_DIR

#! ... hier werden weiter Befehle im Aktuellen Verzeichnis ausgeführt
cd ~/zuruck/zum/script

done
[/code]

Content-ID: 85351

Url: https://administrator.de/contentid/85351

Ausgedruckt am: 26.11.2024 um 10:11 Uhr

Biber
Biber 14.04.2008 um 08:20:35 Uhr
Goto Top
Moin risc2000,

ich weiß ja nicht genau, welches *nix-Derivat Du missbrauchst und kann auch nich ganz eindeutig den Plan erkennen.
Und ich denke, der bash geht es genauso.

IMHO ist das Problem, dass die Shell nicht so genau weiß, ob Du mit $DIRLIST eine Variable oder eine Datei meinst.
Bei mir (Solaris-Büchse) sagt sie das auch bei Deinem Schnipsel:
./forsubdirs: line 2: $DIRLIST: ambiguous redirect
./forsubdirs: line 9: $DIRLIST: ambiguous redirect

Ich würde es so umbauen ( 2 Beispiele mit einer Hilfdatei, eines ohne Datei):
#!/bin/bash
ls -d1 * > DIRLIST
#  Bsp [1]: mit while read... aus Inputdatei DIRLIST
while read _DIR
do
   #  aktuelles Verzeichnis ausgeben
   echo 'cd ' $_DIR  
done < DIRLIST
# Bsp 2: oder mit for in Ausgabe von cat vonner DIRLIST-Datei
for _DIR in `cat DIRLIST` ; do

#! In das Aktuelle Verzeichniss gehen
echo 'cd '$_DIR  

#! ... hier werden weiter Befehle im Aktuellen Verzeichnis ausgeführt
# cd ~/zuruck/zum/script

done

# Bsp 3 ...ohne Datei mit der Ausgabe von ls.
for _DIR in `ls -d1 *` ; do

#! In das Aktuelle Verzeichniss gehen
echo 'cd '$_DIR  

#! ... hier werden weiter Befehle im Aktuellen Verzeichnis ausgeführt
# cd ~/zuruck/zum/script

done
Anmerkung: Variablennamen wie $_DIR finde ich absolut verwegen.
Und Dateinamen wie $DIRLIST (falls es einer sein sollte) auch.

Grüße
Biber
risc2000
risc2000 14.04.2008 um 19:35:31 Uhr
Goto Top
Danke, für die Hinweise aber leider funktioniert das so auch nicht.

Der "ls -d1 *" Befehl listet bei mir die Verzeichnisse nicht Rekursiv. Ein "-R" als Option bringt auch nichts. Deshalb habe ich auch obigen find Befehl benutzt. Zum besseren Verständnis erkläre ich nochmal genau, was ich eigentlich vorhabe. Ich habe ein Verzeichnis, mit sehr vielen Unterverzeichnissen, welche wiederum Unterverzeichnisse enthalten können, irgendwo in diesen Verzeichnissen befinden sich Bilder, also *.jpg Dateien. Ich möchte das gesamte Verzeichnis nun durchsuchen, und wenn in einem der Untererzeichnisse *.jpg Dateien enthalten sind, soll in diesem Verzeichnis eine Datei angelegt werden.

Mit dem folgendem Befehl erstelle ich erstmal eine Liste aller Verzeichnisse, nebst Unterverzeichnisse. (cut dient nur dazu mir am Anfang jeder Ziele, den "./" abzuschneiden.

find -type d | cut -c 3-512 > /tmp/verzeichnisliste.txt

Jetzt möchte ich in einer Schleife diese Liste einlesen, in jedes Verzeichnis "gehen", un dort nach den *.jpg Dateien suchen, wenn diese gefunden werden, soll eine Datei angelegt werden.

while
read line; do

echo $line;

done < verzeichnisliste.txt

Das funktioniert soweit auch, das echo gibt mir zumindest alle Verzeichnisse aus, wenn ich aber im Script "cd $line" anwende funktioniert es nicht. Ich erhalte obige Fehlermeldung.
Biber
Biber 14.04.2008 um 19:58:49 Uhr
Goto Top
Moin risc2000,

dann lass doch das Abschneiden von "./" einfach weg.
Bei mir funktioniert unter der bash jedenfalls nach einem:
_DIR=./subdir

sowohl als auch
cd "$_DIR"
cd $_DIR
und sogar
cd "./$_DIR"

Legt die Vermutung nahe, dass wir unterschiedlich bash's haben.

Grüße
Biber
risc2000
risc2000 14.04.2008 um 20:14:37 Uhr
Goto Top
Danke, ohne den cut geht es jetzt auch bei mir. Hier jetzt zur Vollständigkeit das funktionierende Script, damit kann ich jetzt weiter arbeiten.

#!/bin/bash
find -type d > dirlist.lst

while
read line; do
cd "$line"
touch index.html
cd /zurueck/zum/script/

done < dirlist.lst