2 Stimmen

Bash-Shell-Skript zum Durchblättern von Verzeichnissen und Ausführen einiger Aktionen

Guten Tag, ich habe eine Frage zu einem Skript, mit dem ich Probleme habe. Ich habe vor ein paar Jahren etwas Ähnliches gemacht und habe dieses Skript darauf aufgebaut (das auf einem anderen Server lag). Ich muss das Skript von einem Verzeichnis aus ausführen, das eine Reihe von Verzeichnissen enthält, und für jedes Verzeichnis ein Verzeichnis erstellen und dessen Eigentümer ändern. Das Skript ist:

#!/bin/bash
for DIR in \*;
do 
mkdir $DIR/photos2; 
chown apache:apache $DIR/photos2; 
chmod 777 $DIR/photos2; 
done

Bei der Ausführung erhalte ich - Syntaxfehler bei unerwartetem Token `do'

Ich bin mir sicher, dass ich etwas Dummes übersehe, und wäre für jede Hilfe dankbar.

2voto

JesperE Punkte 61161

Wahrscheinlich wollen Sie so vorgehen:

#!/bin/bash
for DIR in *; do
    if [ -d "$DIR" ]; then 
        mkdir "$DIR/photos2"
        chown apache:apache "$DIR/photos2"
        chmod 777 "$DIR/photos2"
    fi
done
  • Der Fehler bei "do" liegt daran, dass die Bash zeilenorientiert ist und erwartet, dass das "do" in der gleichen Zeile steht. Sie können natürlich stattdessen ein "\" an das Ende der Zeile setzen. EDIT: Dies ist nicht korrekt. Vermutlich eine nicht ganz so gebildete Vermutung.
  • Die Semikolons sind nicht notwendig, wenn die Befehle in verschiedenen Zeilen stehen.
  • Die Anführungszeichen um $DIR sind notwendig, falls Sie Leerzeichen in Dateinamen haben.

2voto

nik Punkte 12812

Ich habe seltsame Dinge mit Drehbüchern erlebt, die in DOS Format.
Schreiben Sie zufällig Code auf einer Windows-Plattform und versuchen Sie, ihn von einer Bash-Shell irgendwo anders auszuführen?

Auf der Bash-Shell gibt es normalerweise einen Befehl namens dos2unix Wenn Sie sie finden, versuchen Sie zu laufen,

dos2unix scriptname

und führen Sie dann das Skript erneut aus.


Sind Sie sicher, dass die Fehlermeldung "unexpected token 'do'" und nicht "done" lautet?
Wie auch immer, ich schlage vor, Sie lesen nach for-Schleife im Bash-Führer


In der Zwischenzeit sollte dies Ihre Arbeit vom Basisverzeichnis aus erledigen (solange Ihre Dateinamen keine Leerzeichen enthalten).

#!/bin/bash
for DIR in $(find . -type d);
do 
    mkdir $DIR/photos2; 
    chown apache:apache $DIR/photos2; 
    chmod 777 $DIR/photos2; 
done

1voto

n-alexander Punkte 13553

Entweder

for DIR in *
do 

o

for DIR in *; do

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X