Эта команда bash работает на OSX, но не на Busybox .. почему?

525
fingertwist

У меня есть этот bash one-liner, он отлично работает на OSX, но не на Linux, я подозреваю, что дистрибутив linux (Busybox) на моем Qnap как-то связан с этим.

Вот команда, которая работает на OSX:

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

Теперь о Qnap:

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

возвращает:

BusyBox v1.01 (2015.05.21-17: 32 + 0000) двоичный файл с несколькими вызовами

Использование: найти [ПУТЬ ...] [ВЫРАЖЕНИЕ]

Поиск файлов в иерархии каталогов. PATH по умолчанию является текущим каталогом; EXPRESSION по умолчанию - '-print'

ВЫРАЖЕНИЕ может состоять из: -Следовать Разыменовать символические ссылки. -name PATTERN Имя файла (удаленные ведущие каталоги) соответствует PATTERN. Печать отпечатка (по умолчанию и предполагается).

-тип X Тип файла соответствует X (где X - одно из: f, d, l, b, c, ...) - PERM PERMS Разрешения соответствуют любому из (+ NNN); все (-NNN); или точно (NNN) -mtime TIME Модифицированное время больше, чем (+ N); меньше чем (-N); или точно (N) дней

Например, если команда find не работает, поэтому, если я выполню только команду find :

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

он работает просто отлично, я получаю все свои файлы, поэтому я подозреваю, что проблема заключается в передаче файлов в команду exec, и вот где я не могу понять это


bash версия osx : GNU bash, версия 3.2.57 (1) -релиз (x86_64-apple-darwin14)

bash версия linux : GNU bash, версия 3.2.57 (1) -релиз (i686-pc-linux-gnu)

0
Почему ты просто не трубишь? В этом конкретном случае легче отладить, если вы конвейер. theoden 8 лет назад 0
BusyBox не ваша типичная система Linux (то есть, в основном POSIX с некоторыми расширениями). Скорее BusyBox - это набор утилит, в которых не хватает многих функций. С другой стороны, скрипт, который вы можете запустить на BusyBox, скорее всего, будет запущен на других системах. Вопрос должен быть переименован в «BusyBox». Thomas Dickey 8 лет назад 0
Хорошая идея, как мне передать каждый файл в ffmpeg? fingertwist 8 лет назад 0
@ThomasDickey да, это то, что я подозреваю, не знаю, как обойти это, чтобы заставить мой единственный лайнер работать на Busybox .. fingertwist 8 лет назад 0
Я бы не стал использовать его в качестве одной строки: создание сложного аргумента `-exec` в отдельный скрипт, вероятно, будет хорошей отправной точкой. Сохраняя простоту частей, вы можете точно определить ограничения, чтобы обойтись один за другим. Thomas Dickey 8 лет назад 0
@ThomasDickey, хорошо, не труба, но самый простой цикл сделает это. `для i в $ (найти. -type f -name" * .mp4 "); do ffmpeg "..."; done`. Или трубка в `awk`, а затем в оболочку. theoden 8 лет назад 0

1 ответ на вопрос

2
Des

Я подозреваю, что это основано на поиске срабатывания одиночной / двойной кавычки.

Обычно я всегда использую что-то подобное в файле сценария (скажем, conv.sh) для более сложных операций:

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

Теперь запустите этот файл с отладкой:

bash -xv ./conv.sh 

Быстрый и грязный скрипт, который должен работать.

Похожие вопросы