найдите: недостающий аргумент - должностное лицо

Я был выручен сегодня с командой, но это, кажется, не работает. Это - команда:

find /home/me/download/ -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 && rm {}\;

Возвраты оболочки

find: missing argument to `-exec'

То, что я в основном пытаюсь сделать, проходят каталог рекурсивно (если он имеет другие каталоги), и работайте на команде ffmpeg .rm типы файлов и преобразовывают их в .mp3 типы файлов. После того как это сделано, удалите .rm файл, который был просто преобразован.

Я ценю любую справку на этом.

198
задан shgnInc 4 January 2014 в 23:17
поделиться

4 ответа

Я понял это сейчас. Когда вам нужно запустить две команды в exec в find, вам действительно нужно иметь два отдельных исполняемых файла. Это наконец сработало для меня.

find . -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 \; -exec rm {} \;
53
ответ дан 23 November 2019 в 05:12
поделиться

Думаю, тебе нужно сбежать.

find /home/me/download/ -type f -name "*.rm" -exec ffmpeg -i {} \-sameq {}.mp3 \&\& rm {}\;
1
ответ дан 23 November 2019 в 05:12
поделиться

И {}, и && вызовут проблемы из-за расширения из командной строки. Я бы посоветовал попробовать:

find /home/me/download/ -type f -name "*.rm" -exec ffmpeg -i \{} -sameq \{}.mp3 \; -exec rm \{} \;
0
ответ дан 23 November 2019 в 05:12
поделиться

Команда -exec должна завершаться ; (поэтому обычно вам нужно вводить \; или ';' чтобы избежать интерпретации оболочкой) или + . Разница в том, что с ; команда вызывается один раз для каждого файла, с + она вызывается как можно меньше раз (обычно один раз, но есть максимальная длина для командная строка, поэтому она может быть разделена) со всеми именами файлов. См. Этот пример:

$ cat /tmp/echoargs
#!/bin/sh
echo $1 - $2 - $3
$ find /tmp/foo -exec /tmp/echoargs {} \;
/tmp/foo - -
/tmp/foo/one - -
/tmp/foo/two - -
$ find /tmp/foo -exec /tmp/echoargs {} +
/tmp/foo - /tmp/foo/one - /tmp/foo/two

Ваша команда содержит две ошибки:

Во-первых, вы используете {}; , но ; должен быть отдельным параметром.

Во-вторых, команда заканчивается на && . Вы указали «запустить поиск, и если это было успешно, удалите файл с именем {}; .». Если вы хотите использовать оболочку в команде -exec , вам необходимо явно запустить ее в оболочке, например -exec sh -c 'ffmpeg ... && rm' .

Однако вы не должны добавлять {} внутри команды bash, это вызовет проблемы, если будут использоваться специальные символы. Вместо этого вы можете передать оболочке дополнительные параметры после -c command_string (см. man sh ):

$ ls
$(echo damn.)
$ find * -exec sh -c 'echo "{}"' \;
damn.
$ find * -exec sh -c 'echo "$1"' - {} \;
$(echo damn.)

Вы видите, что $ вычисляется оболочка в первом примере.Представьте, что существует файл с именем $ (rm -rf /) : -)

(Примечание: - не требуется, но назначается первая переменная после команды в переменную $ 0 , которая представляет собой специальную переменную, обычно содержащую имя запускаемой программы, и установка этого параметра для параметра немного нечисто, хотя, вероятно, здесь это не причинит никакого вреда, поэтому мы устанавливаем это просто - и начать с $ 1 .)

Таким образом, ваша команда может быть чем-то вроде

find -exec bash -c 'ffmpeg -i "$1" -sameq "$1".mp3 && rm "$1".mp3' - {} \;

Но есть способ лучше. find поддерживает и и или , поэтому вы можете делать такие вещи, как find -name foo -or -name bar . Но это также работает с -exec , который принимает значение true, если команда завершается успешно, и false, если нет. См. Этот пример:

$ ls
false  true
$ find * -exec {} \; -and -print
true

Он запускает печать только в том случае, если команда была успешной, что было сделано для true , но не для false .

Таким образом, вы можете использовать два оператора exec, связанные с , и последний будет выполняться только в том случае, если первый был выполнен успешно.

327
ответ дан 23 November 2019 в 05:12
поделиться