Dieser Bash-Befehl wird unter OSX ausgeführt, jedoch nicht unter Busybox.

598
fingertwist

Ich habe diesen bash-Einzeiler, er läuft gut unter OSX, aber nicht unter Linux. Ich vermute, die Linux-Distribution (Busybox) auf meinem Qnap hat etwas damit zu tun.

Hier ist der Befehl, der unter OSX ausgeführt wird:

find . -type f -name "*.mp4" -exec bash -c 'ffmpeg -i "$0" -c:v copy -c:a libfaac -af "volume=23dB" "fix/$0"' '{}' \; 

Nun zum Qnap:

find . -type f -name "*.mp4" -exec bash -c 'ffmpeg -i "$0" -c:v copy -c:a libfaac -af "volume=23dB" "fix/$0"' '{}' \; 

kehrt zurück :

BusyBox v1.01 (2015.05.21-17: 32 + 0000) Multi-Call-Binärcode

Verwendung: Finde [PFAD ...] [EXPRESSION]

Suchen Sie nach Dateien in einer Verzeichnishierarchie. Der Standardpfad PATH ist das aktuelle Verzeichnis. Standardausdruck ist "-print"

EXPRESSION kann aus Folgendem bestehen: - Folge Dereference symbolischen Links. -name PATTERN Der Dateiname (führende Verzeichnisse entfernt) stimmt mit PATTERN überein. -print Print (Standard und angenommen).

-type X Dateityp passt zu X (wobei X eine der folgenden Eigenschaften ist: f, d, l, b, c, ...) -perm PERMS Berechtigungen entsprechen einem der Werte (+ NNN); alles von (-NNN); oder genau (NNN) -Zeit TIME Modifizierte Zeit ist größer als (+ N); weniger als (-N); oder genau (N) Tage

Wie, wenn der Befehl find funktioniert nicht, also wenn ich den ausführen find Befehl allein:

find . -type f -name "*.mp4" 

Es funktioniert einwandfrei, ich bekomme alle meine Dateien, daher vermute ich, dass das Problem darin besteht, dass die Dateien an den exec- Befehl übergeben werden. Dort kann ich es nicht herausfinden


bash version osx : GNU bash, version 3.2.57 (1) -freigabe (x86_64-apple-darwin14)

bash version linux : GNU bash, version 3.2.57 (1) -release (i686-pc-linux-gnu)

0
Warum pfeifen Sie nicht einfach? In diesem speziellen Fall ist das Debugging einfacher, wenn Sie Pipe ausführen. theoden vor 8 Jahren 0
BusyBox ist kein typisches Linux-System (dh meistens POSIX mit einigen Erweiterungen). BusyBox ist vielmehr eine Sammlung von Dienstprogrammen, denen viele Funktionen fehlen. Positiv ist, dass ein Skript, das Sie auf BusyBox ausführen können, wahrscheinlich auf anderen Systemen ausgeführt werden kann. Die Frage sollte in "BusyBox" umbenannt werden. Thomas Dickey vor 8 Jahren 0
Gute Idee, wie würde ich jede Datei an ffmpeg weiterleiten? fingertwist vor 8 Jahren 0
@ThomasDickey Ja, das vermute ich. Ich weiß nicht, wie ich damit umgehen soll, damit mein einziger Liner an Busybox arbeitet. fingertwist vor 8 Jahren 0
Ich würde es nicht als Einzeiler versuchen: Das komplizierte Argument von "-exec" in ein separates Skript umzuwandeln, wäre wahrscheinlich ein guter Ausgangspunkt. Wenn Sie die Teile einfach halten, können Sie die Einschränkungen für die Einzelarbeit festlegen. Thomas Dickey vor 8 Jahren 0
@ThomasDickey, okay, keine Pipe, aber die einfachste Schleife würde es tun. `für i in $ (find. -type f -name" * .mp4 "); do ffmpeg "..."; fertig ". Oder zu 'awk' und dann zur Schale. theoden vor 8 Jahren 0

1 Antwort auf die Frage

2
Des

Ich vermute, es basiert auf der Positionierung der einzelnen / doppelten Anführungszeichen, die bei der Suche nach Stößen auslösen.

Normalerweise verwende ich immer etwas Ähnliches in einer Skriptdatei (z. B. conv.sh) für komplexere Operationen:

find . -type f -name "*.mp4" | while read FILE do ffmpeg -i "$FILE" -c:v copy -c:a libfaac -af "volume=23dB" "fix/$FILE" done 

Führen Sie nun diese Datei mit dem Debugging aus:

bash -xv ./conv.sh 

Ein schnelles und schmutziges Skript, das funktionieren sollte.