LINUX.ORG.RU

Вопрос по find -name -exec

 , ,


0

1

Доброго времени.

Конвертирую директорию, содержащую файлы с расширением flac в mp3, используя ffmpeg:

find . -name "*.flac" -exec ffmpeg -i {} -ab 320k -map_metadata 0 -id3v2_version 3 {}.mp3 \;

Теперь в папке лежат файлы с расширением ".flac" и ".flac.mp3". Как оставить только ".flac" и ".mp3" (без ".flac.mp3")? Спасибо.


Как оставить только ".flac" и ".mp3" (без ".flac.mp3")?

ну так ентоже теже файлы mp3, расширение имя дописано в конец файла по идее, они же мп3 файлы?

safocl ★★ ()

Однострочники это круто конечно и всё такое. Но если предполагается хоть какой-то минимальный реюз, то оформи нормальным скриптом.

Сделай по аналогии (там и расширения отрезаются ненужные и добавляются нужные)

Цикл из строк. (комментарий)

justAmoment ★★★★★ ()
 find . -name "*.flac" |while read name;do ffmpeg -i ${name} -ab 320k -map_metadata 0 -id3v2_version 3 ${name/.flac/}.mp3 ;done

или для универсальности можно ${name/.flac/} заменить на ${name%.*}

safocl ★★ ()
Последнее исправление: safocl (всего исправлений: 1)
Ответ на: комментарий от safocl

выводит ошибку:

./01: No such file or directory

и т.д. по остальным...

dncaps ()
Ответ на: комментарий от dncaps

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

safocl ★★ ()

Пытался сделать:

find . -name "*.flac.mp3" -exec mv '{}'.mp3 \;

выдал «*.flac.mp3.mp3».

dncaps ()
Ответ на: комментарий от dncaps

ну так естественно, ты добавляешь в конец еще одно .mp3 значение

safocl ★★ ()
Ответ на: комментарий от safocl

Заменил пробелы нижним подчёркиванием - перекодировал только первый в списке файл. Остальные не.

dncaps ()

Проще говоря, как сделать file.flac.mp3 > file.mp3 для нескольких файлов в папке?

dncaps ()
Ответ на: комментарий от dncaps

а так :

find . -name "*.flac.mp3" |while read name;do mv ${name} ${name%.flac} ;done

safocl ★★ ()
Ответ на: комментарий от safocl

usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory
dncaps ()
Последнее исправление: dncaps (всего исправлений: 1)
Ответ на: комментарий от dncaps

find . -name «*.flac.mp3» |while read name;do mv «${name}» «${name%.flac}» ;done

а так? там у тебя наверна с пробелами имена

safocl ★★ ()
Ответ на: комментарий от safocl

Так совсем ничего не происходит.

Уму, имена с пробелами плюс маковский терминал плюс я гуманитарий, короче, беда...

dncaps ()

rename заюзать rename /flac// *.mp3

anonymous ()
Ответ на: комментарий от dncaps

берешь

 rm *.mp3

find . -name "*.flac" |while read name;do ffmpeg -i ${name} -ab 320k -map_metadata 0 -id3v2_version 3 ${name/.flac/}.mp3 ;done


и все должно получиться

safocl ★★ ()
Ответ на: комментарий от anonymous

Если так:

rename 's/flac//' *.mp3

получаются названия вида file..mp3

Если так:
rename 's/flac.//' *.mp3

То всё ок!

dncaps ()

Спасибо всем большое!

В итоге рабочая команда:

find . -name "*.flac" -exec ffmpeg -i {} -ab 320k -map_metadata 0 -id3v2_version 3 {}.mp3 \; && rename 's/flac.//' *.mp3

dncaps ()
Ответ на: комментарий от dncaps

а если переменные в кавычки заключить? ${name/.flac/}.mp3 менять на «${name/.flac/}.mp3»

просто у меня даже с файлами в именах которых пробелы все норма

аа стой, там наверна на енто ругается ${name/.flac/} наверна надо без последнего слеша — ${name/.flac} так вот

хатя у меня не возникает из-за него проблем, все нормально отображается...

safocl ★★ ()
Последнее исправление: safocl (всего исправлений: 2)
Ответ на: комментарий от safocl

Странно. Если заковычить только «${name/.flac/}.mp3», то выводит ту же ошибку с пробелами. Если заковычить также «${name}»:

find . -name "*.flac" |while read name;do ffmpeg -i "${name}" -ab 320k -map_metadata 0 -id3v2_version 3 "${name/.flac/}.mp3" ;done

то кодирует с нормальным именем (вида, file.mp3) только первый файл, другие не трогает.

upd ${name/.flac} - ничего не изменилось

dncaps ()
Последнее исправление: dncaps (всего исправлений: 1)

Сделай так.

for i in $(ls *.flac.mp3); do
    newname="$(echo $i | sed 's/.flac//')"
    mv "$i" "$newname"
done

SEInterix ()
Ответ на: комментарий от SEInterix

Делать это имеет смысл, конечно же, уже после выполнения твоей команды из ОП.

SEInterix ()
Ответ на: комментарий от SEInterix

Запустил ваш скрипт, вывод:

mv: rename 01 to 01: No such file or directory
mv: rename - to -: No such file or directory
mv: rename Used to Used: No such file or directory
mv: rename To to To: No such file or directory
mv: rename Get to Get: No such file or directory
mv: rename High to High: No such file or directory
mv: rename - to -: No such file or directory
mv: rename John to John: No such file or directory
mv: rename Butler.flac.mp3 to Butler.mp3: No such file or directory
и так для каждого файла, что-то с пробелами ему не нравится.
launuapaso ~/John Butler 2007 John Butler Live At Twist & Shout ls -1
01 - Used To Get High - John Butler.flac
01 - Used To Get High - John Butler.flac.mp3

dncaps ()
Последнее исправление: dncaps (всего исправлений: 2)
Ответ на: комментарий от dncaps

newname=«$(echo $i | sed 's/.flac//')»

Да, у меня тут небольшая ошибка. Закавычь $i, и будет работать.

SEInterix ()
Ответ на: комментарий от SEInterix
for i in $(ls *.flac.mp3); do
    newname="$(echo '$i' | sed 's/.flac//')"
    mv "$i" "$newname"
done

закавычил, вывод тот же.

dncaps ()
Последнее исправление: dncaps (всего исправлений: 1)
Ответ на: комментарий от dncaps

Хм, да, с ls плохо работает.

Специально проверенная и отлаженная для тебя версия:

for i in $(find -name "*.flac.mp3" -print); do
    newname="$(echo '$i' | sed 's/.flac//')"
    mv "$i" "$newname"
done

SEInterix ()
Ответ на: комментарий от SEInterix

Вывод:

find: illegal option -- n
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
       find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
Возможно, здесь уже начались особенности osx. Linux под рукой нет, чтобы прогнать скрипт.

В любом случае, спасибо за дополнительные варианты решений.

dncaps ()
Ответ на: комментарий от SEInterix

Если поставить точку после find:

for i in $(find . -name "*.flac.mp3" -print); do
... 
то вновь:
mv: rename ./01. to $i: No such file or directory
mv: rename Main to $i: No such file or directory

dncaps ()
Последнее исправление: dncaps (всего исправлений: 1)
Ответ на: комментарий от dncaps

А вот это удивило. Покажи просто find . -name "*.flac.mp3" -print? Чую, что выводит оно не в том формате, который ожидается.

SEInterix ()
Ответ на: комментарий от SEInterix
launuapaso ~/Idenline 2012 TBI 01 ls
01 - You & Me.flac                03 - Hearts Lullaby.flac          05 - At Sunset.flac
01 - You & Me.flac.mp3            03 - Hearts Lullaby.flac.mp3      05 - At Sunset.flac.mp3
02 - Way to an Angel.flac         04 - Together (VIP Mix).flac      06 - Lonesome.flac
02 - Way to an Angel.flac.mp3     04 - Together (VIP Mix).flac.mp3  06 - Lonesome.flac.mp3
launuapaso ~/Idenline 2012 TBI 01 find . -name "*.flac.mp3" -print
./01 - You & Me.flac.mp3
./02 - Way to an Angel.flac.mp3
./03 - Hearts Lullaby.flac.mp3
./04 - Together (VIP Mix).flac.mp3
./05 - At Sunset.flac.mp3
./06 - Lonesome.flac.mp3
launuapaso ~/Idenline 2012 TBI 01
dncaps ()
Ответ на: комментарий от dncaps

(/bin/ls, потому что у меня ls — алиас на ls -al)

 → /bin/ls
test.flac.mp3
 → for i in $(find . -name "*.flac.mp3" -print); do newname="$(echo "$i" | sed 's/.flac//')"; mv "$i" "$newname"; done
 → /bin/ls
test.mp3
Ладно, я сдаюсь. :( Если вариант выше не отработает корректно, то я не в курсе, что делать. Поменяй теги, чтобы скастовать маководов.

SEInterix ()
Ответ на: комментарий от SEInterix

Поставил такой же алиас на ls - те же «No such file or directory». Я мучил bash месяца три, прежде чем здесь спросить :) Всё равно, благодарю. Тем более, что одно из рабочих решений выше было найдено.

dncaps ()
Ответ на: комментарий от SEInterix

Не зря! Не у меня, так у других ваш вариант сработает.

dncaps ()
Ответ на: комментарий от teod0r
find . -name "*.flac" | while IFS= read -r name ; do ffmpeg -i "${name}" -ab 320k -map_metadata 0 -id3v2_version 3 "${name/.flac/}.mp3" ; done

конвертит первый флак в мп3, далее выдаёт:

Parse error, at least 3 arguments were expected, only -1 given in string ''

dncaps ()
#!/bin/bash

function flac2mp3() {
  local dir="$1"
  while read flac_file; do
    local mp3_file="${flac_file%%.flac}.mp3"
    ffmpeg -i "$flac_file" -ab 320k -map_metadata 0 -id3v2_version 3 "$mp3_file"
  done < <(find "$dir" -name "*.flac" -type f -maxdepth 1)
}

И потом flac2mp3 "$HOME/Idenline 2012 TBI 01" из консоли или из скрипта

KennyMinigun ★★★★★ ()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от KennyMinigun
launuapaso ~/Idenline 2012 TBI 01 sh flac2mp3.sh
flac2mp3.sh: line 8: syntax error near unexpected token `<'
flac2mp3.sh: line 8: `  done < <(find "$dir" -name "*.flac" -type f -maxdepth 1)'
dncaps ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.