Я был выручен сегодня с командой, но это, кажется, не работает. Это - команда:
find /home/me/download/ -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 && rm {}\;
Возвраты оболочки
find: missing argument to `-exec'
То, что я в основном пытаюсь сделать, проходят каталог рекурсивно (если он имеет другие каталоги), и работайте на команде ffmpeg .rm
типы файлов и преобразовывают их в .mp3
типы файлов. После того как это сделано, удалите .rm
файл, который был просто преобразован.
Я ценю любую справку на этом.
Я понял это сейчас. Когда вам нужно запустить две команды в exec в find, вам действительно нужно иметь два отдельных исполняемых файла. Это наконец сработало для меня.
find . -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 \; -exec rm {} \;
Думаю, тебе нужно сбежать.
find /home/me/download/ -type f -name "*.rm" -exec ffmpeg -i {} \-sameq {}.mp3 \&\& rm {}\;
И {}, и && вызовут проблемы из-за расширения из командной строки. Я бы посоветовал попробовать:
find /home/me/download/ -type f -name "*.rm" -exec ffmpeg -i \{} -sameq \{}.mp3 \; -exec rm \{} \;
Команда -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, связанные с -и
, и последний будет выполняться только в том случае, если первый был выполнен успешно.