2016-07-22 11 views
0

У меня есть серия каталогов, содержащих несколько mp3-файлов с именами файлов 001.mp3, 002.mp3, ..., 030.mp3.Сортировка вывода find перед запуском команды в -exec

Что я хочу сделать, это объединить их в единый mp3-файл и добавить к нему некоторые метаданные.

Вот то, что я в данный момент (удалить некоторые определения переменных, для ясности):

#!/bin/bash 
for d in */; do 
    cd $d 
    find . -iname '*.mp3' -exec lame --decode '{}' - ';' | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3 
    cd .. 
done 

Иногда это работает, и я получаю один файл со всеми «дорожки» в правильном порядке.

Однако чаще всего я получаю один файл со всеми «дорожками» в обратном порядке, что на самом деле не очень хорошо.

Что я не могу понять, так это то, что порядок варьируется между разными сценами сценария, поскольку все каталоги содержат один и тот же набор имен файлов. Я вылил на страницу man и не могу найти опцию сортировки для поиска.

Я мог бы запустить find . -iname '*.mp3' | sort -n >> temp.txt, чтобы поместить файлы во временный файл, а затем попытаться пройти через него, но я не могу заставить это работать с хромым.

Есть ли способ разместить сортировку до того, как поиск запускает exec? Я могу найти множество примеров здесь и в других местах, чтобы сделать это с помощью -exec ls, но не там, где нужно выполнить что-то более сложное с помощью exec.

+0

Нажимая границы моих собственных способностей к bash, но могу ли я сделать что-то вроде 'find. -iname '* .mp3' | sort -n | xargs '? Если да, то как мне переделать хромую команду для ввода ввода? – yknivag

+0

temp.txt включает полный путь или только последовательность имен файлов? –

+0

Я бы предпочел не использовать временный файл вообще, если это возможно. Но он, предположительно, может быть сконструирован так, чтобы содержать любой тип имени файла. – yknivag

ответ

1
find . -iname '*.mp3' -print0 | sort -zn | xargs -0 -I '{}' lame --decode '{}' - | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3 

Непрошеный, но, возможно, стоит попробовать.

Обычно xargs добавляет аргументы в конец команды, которую вы ему даете. Опция -I указывает, что вместо этого вместо этой строки вместо этого ({}).


Edit: Я добавил -print0, -z, -0, чтобы убедиться, что трубопровод по-прежнему работает, даже если ваши имена файлов содержат символы новой строки.

+0

изменить 'sort -n' на' sort -zn', потому что сортировка по умолчанию возвращает записи, разделенные новой строкой – oakymax

+0

Я не могу предложить редактировать - должно быть добавлено не менее 6 символов)) – oakymax

+0

@melpomene СПАСИБО! Это прекрасно работает. – yknivag