Während ich BASH seit mehreren Jahren benutze, sind meine Erfahrungen mit BASH-Skripten relativ begrenzt.
Mein Code ist wie folgt. Es sollte die gesamte Verzeichnisstruktur aus dem aktuellen Verzeichnis heraus abrufen und in dieses replizieren $OUTDIR
.
for DIR in `find . -type d -printf "\"%P\"\040"`
do
echo mkdir -p \"${OUTPATH}${DIR}\" # Using echo for debug; working script will simply execute mkdir
echo Created $DIR
done
Das Problem ist, hier ist ein Beispiel meiner Dateistruktur:
$ ls
Expect The Impossible-Stellar Kart
Five Iron Frenzy - Cheeses...
Five Score and Seven Years Ago-Relient K
Hello-After Edmund
I Will Go-Starfield
Learning to Breathe-Switchfoot
MMHMM-Relient K
Beachten Sie die Leerzeichen: -S Und for
nimmt Parameter wortweise an, sodass die Ausgabe meines Skripts ungefähr so aussieht:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Learning"
Created Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot"
Created Breathe-Switchfoot
Aber ich brauche es, um ganze Dateinamen (eine Zeile nach der anderen) aus der Ausgabe von zu holen find
. Ich habe auch versucht, find
jeden Dateinamen in doppelte Anführungszeichen zu setzen. Aber das hilft nicht.
for DIR in `find . -type d -printf "\"%P\"\040"`
Und mit dieser geänderten Zeile ausgeben:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"""
Created ""
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"Learning"
Created "Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot""
Created Breathe-Switchfoot"
Jetzt brauche ich eine Möglichkeit, die ich auf diese Weise durchlaufen kann, da ich auch einen komplizierteren Befehl ausführen möchte, der gstreamer
für jede Datei eine ähnliche Struktur aufweist. Wie soll ich das machen?
Bearbeiten: Ich benötige eine Codestruktur, mit der ich für jedes Verzeichnis / jede Datei / Schleife mehrere Codezeilen ausführen kann. Entschuldigung, wenn ich unklar war.
Lösung: Ich habe anfangs versucht:
find . -type d | while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done
Dies hat zum größten Teil gut funktioniert. Später stellte ich jedoch fest, dass, da die Pipe dazu führt, dass die while-Schleife in einer Subshell ausgeführt wird, alle in der Schleife gesetzten Variablen später nicht mehr verfügbar waren, was die Implementierung eines Fehlerzählers ziemlich schwierig machte. Meine endgültige Lösung (aus dieser Antwort auf SO ):
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
Dies erlaubte mir später, Variablen innerhalb der Schleife bedingt zu inkrementieren, die später im Skript verfügbar bleiben würden.
/
und nicht druckbare Zeichen erlauben . Aber alles ist erlaubt, außer /
und \0
du musst es ihnen erlauben.