[Shell] Alle Dateien in Ordner auflisten und an Schleife übergeben

Crys

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.634
Ich möchte gerne alle Dateien in einem Ordner (ohne Unterordner) bestimmen und dann mit dem Dateinamen und dem Dateisuffix (beide getrennt) weiter arbeiten.

Code:
#!/bin/bash
for datei in {find "/media/mein ordner" -type f}
do
# ...
echo "Befehl -datei $dateiname -typ $dateisuffix"
done
So in der Art ...
Wie bekomme ich das hin?
 
Hallo Crys,

hier hast du mehrere Möglichkeiten dies um zu setzen.

1. kannst du die Ausgabe des Befehls "find" an einen anderen befehl weiter geben, dies kannst du mit einer so genannten "pipe" machen das wäre dann dieses Zeichen |

2. Was ich bevorzugen würde, wäre die Ausgabe des find Befehls in einer Variable zu speichern, da du diese immer wieder anderweitig nutzen kannst falls du vorhast an dem Datansatz noch etwas zu ändern.

Beispiel: LIST="$(find "/media/mein ordner" -type f)"

Jetzt ist alles was du mit "find" gefunden hast in der Variable LIST gespeichert und kann weiter verwendet werden.

Gruß
 
Danke craziicore für die schnelle Antwort.
Ich würde auch 2. bevorzugen. So wie ich das sehe, wird aber kein Array geschrieben sondern eine Variable mit allen Elementen durch Leerzeichen getrennt!?
Nur wie wurstel ich das wieder auseinander?
Und wie lasse ich dann die Schleife damit durchlaufen?
 
Code:
LIST="$(find "/media/mein ordner" -type f)"
Beachte, dass das Probleme geben kann, wenn Dateinamen Leerzeichen o.ä. enthalten
 
Jedes Leerzeichen erzeugt ein neues Element, sodaß "/home/John Doe/Hilfe.txt" nicht ein Element ist, sondern als zwei Elemente, nämlich "/Home/John" und "Doe/Hilfe.txt" später abgearbeitet werden.

Eine einfache Methode, dies zu umgehen, wäre, alle Elemente in eine temporäre Datei zu schreiben, und diese auszulesen. Hierbei sollte dann vorher der Feldtrenner in CR geändert werden, sonst ergibt sich das gleiche Problem.

Code:
    IFS=$(echo -en "\n\b")

Idealerweise schreibst Du vorher den Feldtrenner in eine andere Variable, damit Du den vorigen Zustand auch wieder herstellen kannst.
 
Twostone schrieb:
Jedes Leerzeichen erzeugt ein neues Element, sodaß "/home/John Doe/Hilfe.txt" nicht ein Element ist, sondern als zwei Elemente, nämlich "/Home/John" und "Doe/Hilfe.txt" später abgearbeitet werden.
Das ist einleuchtend und deshalb habe ich in meinem Beispiel extra ein Leerzeichen eingefügt ;)

Zum Rest kann ich leider nur sagen: Bahnhof.
Ich finde nichts, wie ich anhand einer Liste oder Variablen eine Schleife durchlaufen kann. Dazu finde ich auch kein Beispiel ...

Das ist mein erstes Shell Skript und ich möchte schlicht und einfach alle Video Dateien in einem Ordner mit Handbrake konvertieren.

Für ein funktionsfähiges minimal Beispiel wäre ich sehr dankbar :)
 
Wenn Du für Textdateien in einem Verzeichnis irgend etwas durchführen willst:

Code:
#!/bin/bash
#quick'n'dirty
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for FILE in $(ls | egrep -i "\.txt$"); do  #Regex Filterung nach Dateiendung
   FILE=$(echo "${PWD}/${FILE}" | sed 's/ /\\ /g')
   echo "${FILE}" ##hier ersetzen mit dem, was Du vorhast
done
IFS=$SAVEIFS

Für alle Dateien kannst Du auch Pipe und egrep in Zeile fünf löschen.
 
Vielen Dank Twostone!

Ich habe den Code etwas ergänzt und gekürzt.
Code:
IFS=$(echo -en "\n\b")
Pfad="/media/mein ordner"
Typ="mkv"
for FILE in $(ls $Pfad | egrep -i "\.$Typ$"); do
   #FILE=$(echo "${FILE}" | sed 's/ /\\ /g')
   Datei=$(echo "${FILE}" | sed "s/.$Typ//g")
   #echo "Pfad=$Pfad;Datei=$Datei;Typ=$Typ" ##hier ersetzen mit dem, was Du vorhast
   HandBrakeCLI -i "$Pfad/$Datei.$Typ" -o "$Pfad/$Datei_TEST.$Typ" -e x264 -q 50
done
Mit dem Ergebnis aus deiner Zeile 6 konnte ich nichts anfangen, da ja ein Slash vor jedem Leerzeichen war. Auch verstehe ich nicht das ${PWD}/, das ja nur mein home-Verzeichnis anhängt (was ja nicht korrekt ist)?
Ich habe gerade meinen
 
Code:
sed 's/ /\\ /g'
... sorgt in der Tat dafür, daß jedes Leerzeichen durch einen backslash gefolgt von einem Leerzeichen ersetzt wird. Demgemäß kannst Du den Dateinamen dann auch in Regex nutzen.

${PWD} gibt Dir das aktuelle Arbeitsverzeichnis aus.

Ich würde Dir empfehlen, Variablennamen in geschweifte Klammern zu setzen. Hilft auch im Nachhinein zur besseren Lesbarkeit in verschachtelten Ausdrücken. Manchmal kann's auch Fehler verhindern.
 
Oder mit while Schleife:
Code:
find /suchpfad | while read line; do 
    echo $line; 
done
 
Zurück
Oben