Rekursives Auslesen über 2 Ebenen und Ausführen von mehreren Befehlen

T

tihnk

Mausschubser
Hallo zusammen,
mein Ziel ist das rekursive Auslesen von 2 Verzeichnisebenen und das ausführen von Befehlen auf den vorhandenen Dateien. Konkret handelt es sich um Videos im avi-Format, die ich zunächst in einzelne jpgs zerlegen muss um sie dann in einem zweiten Schritt einem Programm zuzuführen, das seinerseits txt-Files erstellt.

Ich verwende Ubuntu 8.04/bash 3.2.39.

Die Dateien liegen unter /home/user/Desktop/ in den Verzeichnissen v14 und v15.

Mit Hilfe von
Code:
mogrify -format jpg ./v15/40-40/v15_40-40_03.avi
kann ich die einzelnen Dateien zerlegen.

Mit
Code:
find . -name *.avi
kann ich mir die Dateien anschauen. Nun hab ich etwas gegoogelt, und der erste Schritt wäre nun, die Dateien via find und mogrify zu bearbeiten, in etwa so
Code:
 find . -name *.avi -exec "mogrify -format jpg {}" \;

Leider bekomme ich ein
Code:
find: mogrify -format jpg ./Desktop/v15/40-40/v15_40-40_03.avi: No such file or directory
als Antwort. Was ist in dem Script nun nicht ganz richtig? ?(

Außerdem wäre mein Wunsch, dass die jpgs in (zu erstellende) Verzeichnisse gelegt werden, also z.B. in v15/40-40/03 (für Datei 03).

Und dann schließlich als letztes das ausführen des Programms auf den einzelnen jpgs mit Ausgabe einer txt.

Kann ich das alles in "exec" integrieren..? Wäre für Tipps sehr dankbar!
 
Zuletzt bearbeitet:
Abend,

versuchs mal mit
Code:
 find . -name *.avi -exec mogrify -format jpg '{}' \;
Durch die Anführugnszeichen um das mogrify will er wirklich die Datei "mogrify -format jpg ./Desktop/v15/40-40/v15_40-40_03.avi" ausführen.

mfg
HeadCrash
 
Mhm... so einfach kann es manchmal sein... Danke dir soweit! :)

Bleibt das Problem mit den Verzeichnissen. Ist folgender Ansatz erfolgsversprechend? Ich werde versuchen, auf jeden Treffer von find ein Script laufen zu lassen, das mir das macht was ich will...
 
Hi,

ausserdem solltest du zur Sicherheit das Suchmuster nochmal quoten:
Code:
find . -name '*.avi' -exec mogrify -format jpg '{}' \;
Das Asterisk (*) wird von der Shell ausgewertet, bevor es an find uebergeben wird. D.h. wenn es in dem Verzeichnis in dem du dich gerade befindest Dateien gibt, die *.avi matchen, dann wird *.avi entsprechend ersetzt.

Außerdem wäre mein Wunsch, dass die jpgs in (zu erstellende) Verzeichnisse gelegt werden, also z.B. in v15/40-40/03 (für Datei 03).
[...]
Kann ich das alles in "exec" integrieren..? Wäre für Tipps sehr dankbar!
Wenn du mehr als ein simples Kommando ausfuehren willst, solltest du das besser in einer Schleife machen, als zu versuchen das in eine einzelne exec Anweisung zu stopfen.

So in diese Richtung:
Code:
find . -name '*' | while read line; do 
  echo $line
done

Die Alternative waere, wo du ja selbst schon drauf gekommen bist, noch ein zweites Skript zu schreiben. Aber das ist eigentlich unnoetig unuebersichtlich.

Und dann schließlich als letztes das ausführen des Programms auf den einzelnen jpgs mit Ausgabe einer txt.
Den Satz verstehe ich nicht.

mfg,
bytepool
 
Zuletzt bearbeitet:
ausserdem solltest du zur Sicherheit das Suchmuster nochmal quoten:
Code:
find . -name '*.avi' -exec mogrify -format jpg '{}' \;
Das Asterisk (*) wird von der Shell ausgewertet, bevor es an find uebergeben wird. D.h. wenn es in dem Verzeichnis in dem du dich gerade befindest Dateien gibt, die *.avi matchen, dann wird *.avi entsprechend ersetzt.

Ok, danke. PHP find ich echt super easy gegenüber bash scripting... :D

Wenn du mehr als ein simples Kommando ausfuehren willst, solltest du das besser in einer Schleife machen, als zu versuchen das in eine einzelne exec Anweisung zu stopfen.

So in diese Richtung:
Code:
find . -name '*' | while read line; do 
  echo $line
done
Ok danke, ich denke, den Ansatz werde ich versuchen.

Den Satz verstehe ich nicht.
Na, erst finden > jpgs extrahieren > Verzeichnis erstellen > Bilder auswerten > Ergebnisse in Verzeichnisse schreiben (txt, neues jpg).
 
Hi,
Na, erst finden > jpgs extrahieren > Verzeichnis erstellen > Bilder auswerten > Ergebnisse in Verzeichnisse schreiben (txt, neues jpg).
Die Aussage finde ich immer noch recht verwirrend, aber ich hab deinen ersten Post nochmal ganz gelesen, und ich glaube jetzt verstanden zu haben was du meinst. ;)
Du bezogst dich implizit auf eine Aussage direkt am Anfang. Ich hatte nicht verstanden was denn jetzt Textdateien damit zu tun haben, aber du hast noch ein weiteres Zerstueckelungsprogramm das dir Textdateien liefert, wenn ich das jetzt richtig verstanden hab.

Zum weiterverarbeiten der Variablen helfen dir wahrscheinlich "dirname", "basename" und parameter expansion.

mfg,
bytepool
 
Ja, danke! :) Ich bastel mal...

Code:
find . -name '*.avi' | while read line; do
  echo $line
  filedir="$(dirname "$line")"
  filename="$(basename "$line" .avi)"

  # Verzeichnis erstellen
  if [ -d $filedir/$filename ];
  then
     echo "Verzeichnis $filedir/$filename existiert."
  else
     mkdir $filedir/$filename
  fi

  # Mogrify starten
  mogrify -format jpg -path $filedir/$filename $line

  # Tool starten


done
 
Zuletzt bearbeitet:

Ähnliche Themen

Frage zu find

[HowTo] TeamSpeak 2 - RC2 - Server (Deutsch/Englisch)

Zurück
Oben