dr_magnus 01.06.2010 01:51
Есть вопрос! — Почему не отрабатывает скрипт?
Решил я переименовать кучку МР3-файлов согласно прописанных тэгов.Пишу однострочник:
# find -iname '*.mp3' -print0 | xargs -0 -I {} echo {}
./01.mp3
./02.mp3
./03.mp3
...
./0N.mp3
./02.mp3
./03.mp3
...
./0N.mp3
Отлично, отработал.
Нужно убрать из имени ./ и .mp3 - использую sed:
# find -iname '*.mp3' -print0 | xargs -0 -I {} echo {} | sed s/..// | sed s/.mp3/" - "/
01 -
02 -
03 -
...
0N -
02 -
03 -
...
0N -
Тоже хорошо.
Теперь нужно переименовать файлы в виде 01 - Имя трека:
# find -iname '*.mp3' -print0 | xargs -0 -I {} eyeD3 --rename="`echo {} | sed s/..// | sed s/.mp3/" - "/`%t" {}
Имя трека 1
Имя трека 2
...
Имя трека N
Имя трека 2
...
Имя трека N
Теперь вопрос - а куда же делись мои 01, 02, 03 и т.д.? Где я допустил ошибку в однострочнике?
ок. спасибо. признаю, что не внимательно прочитал мануал.
но вопрос остается - почему не отработал скрипт, а конкретно та часть, которая "`echo и т.д.?
но вопрос остается - почему не отработал скрипт, а конкретно та часть, которая "`echo и т.д.?
Есть предположение, что он не срабатывает из-за слишком большой вложенности: "{}" не обрабатывается внутри обратных кавычек.
Как вариант, подобную ситуацию можно разрулить через цикл while и переменную, которая будет сохраняться внутри цикла независимо от вложенности:
find -iname '*.mp3' | while read LINE ; do
eyeD3 --rename="`echo ${LINE} | sed s/..// | sed s/.mp3/" - "/`%t" $LINE
done
Как вариант, подобную ситуацию можно разрулить через цикл while и переменную, которая будет сохраняться внутри цикла независимо от вложенности:
find -iname '*.mp3' | while read LINE ; do
eyeD3 --rename="`echo ${LINE} | sed s/..// | sed s/.mp3/" - "/`%t" $LINE
done
"{}" не обрабатывается внутри обратных кавычек
это предположение или аксиома?
просто мне хотелось написать именно однострочник, без всяких while.. do и т.д.
может кто-нить, разбирающийся в скриптах, все же даст подсказку?
дело в том, что это не первая моя попытка - все эксперименты с использованием команды в качестве аргументы приводили к неудаче. помогите, плз - очень хочется разобраться.
спасибо.
Аксиома?
Суди сам:
$ cat track
$ cat track
Это лишь первые строки лога, но по ним уже видно, что в случае цикла на обработку sed передается путь к файлу, а в случае с твоим однострочником — нет.
Хочешь принципиально это всё реализовать в одну строку?
find -iname '*.mp3' | while read LINE ; do ; eyeD3 --rename="`echo ${LINE} | sed s/..// | sed s/.mp3/" - "/`%t" ${LINE} ; done
А xargs (ровно так же, как и родной '-exec' у find) либо ущербен, либо я просто не умею его готовить.
Суди сам:
$ cat track
#!/bin/bash
find -iname '*.mp3' -print0 | xargs -0 -I {} eyeD3 --rename="`echo {} | sed s/..// | sed s/.mp3/" - "/`%t" {}
#find -iname '*.mp3' | while read LINE ; do
#eyeD3 --rename="`echo ${LINE} | sed s/..// | sed s/.mp3/" - "/`%t" ${LINE}
#done
bash -x track IN2F log
+ find -iname '*.mp3' -print0
++ echo '{}'
++ sed s/..//
++ sed 's/.mp3/ - /'
+ xargs -0 -I '{}' eyeD3 --rename=%t '{}'
find: `./orbit-root': Отказано в доступе
Renaming file to 'Try Honesty'
+ find -iname '*.mp3' -print0
++ echo '{}'
++ sed s/..//
++ sed 's/.mp3/ - /'
+ xargs -0 -I '{}' eyeD3 --rename=%t '{}'
find: `./orbit-root': Отказано в доступе
Renaming file to 'Try Honesty'
$ cat track
#!/bin/bash
#find -iname '*.mp3' -print0 | xargs -0 -I {} eyeD3 --rename="`echo {} | sed s/..// | sed s/.mp3/" - "/`%t" {}
find -iname '*.mp3' | while read LINE ; do
eyeD3 --rename="`echo ${LINE} | sed s/..// | sed s/.mp3/" - "/`%t" ${LINE}
done
bash -x track IN2F log
+ find -iname '*.mp3'
+ read LINE
find: `./orbit-root': Отказано в доступе
++ echo ./2003 - Billy Talent/Try Honesty.mp3
++ sed s/..//
++ sed 's/.mp3/ - /'
+ eyeD3 '--rename=2003 - Billy Talent/Try Honesty - %t' ./2003 - Billy Talent/Try Honesty.mp3
+ find -iname '*.mp3'
+ read LINE
find: `./orbit-root': Отказано в доступе
++ echo ./2003 - Billy Talent/Try Honesty.mp3
++ sed s/..//
++ sed 's/.mp3/ - /'
+ eyeD3 '--rename=2003 - Billy Talent/Try Honesty - %t' ./2003 - Billy Talent/Try Honesty.mp3
Это лишь первые строки лога, но по ним уже видно, что в случае цикла на обработку sed передается путь к файлу, а в случае с твоим однострочником — нет.
Хочешь принципиально это всё реализовать в одну строку?
find -iname '*.mp3' | while read LINE ; do ; eyeD3 --rename="`echo ${LINE} | sed s/..// | sed s/.mp3/" - "/`%t" ${LINE} ; done
А xargs (ровно так же, как и родной '-exec' у find) либо ущербен, либо я просто не умею его готовить.
спасибо большое. буду разбираться.
хотя по прежнему не понятно, почему так происходит :-(
хотя по прежнему не понятно, почему так происходит :-(
find -iname '*.mp3' -print0 | xargs -0 -I {} eyeD3 --rename="%n - %t" {}