2016-03-28 2 views
0

Я искал и много тем танцевал вокруг того, чего я пытаюсь выполнить. У меня есть более 2000 файлов m4a, зарытых в 17 000 mp3. Структура каталога /home/me/Музыка/MP3 /Artist/Album/song.m4a. Я хочу использовать «найти», чтобы открыть песни m4a, переместить их, их каталог альбомов и каталог их исполнителей на /home/me/Music/M4A/Исполнитель/Альбом /song.m4a. Я был неудачен с коммутатором mv -exec, и я неудачно использовал basename и/или dirname для создания сценария. Родительские и родительские каталоги меня бросили. Перемещение самих файлов не является проблемой, просто создавая структуру каталогов И перемещая файлы. По частям я экспортировал список файлов find /home/me/Music/MP3 -name "*.m4a" >> dir.sh (отчасти потому, что я хотел видеть расположение файлов и количество песен). Затем я запустил sed 's/MP3/M4A/g' dir.sh, чтобы заменить MP3 на M4A. Отбросьте song.m4a, как в этом примере из dir.sh оставит меня со списком Исполнитель/Album каталогов для запуска через цикл while с mkdir: /home/me/Music/M4A/Metallica/Re-load/Metallica - Unforgiven.m4a. К сожалению, вот где я застрял, dirname дает «.»Сценарий Bash для перемещения файлов и их родительского каталога

+0

Посмотрите здесь, чтобы форматировать ваш вопрос: http://stackoverflow.com/editing-help –

+1

будет больше в соответствии с философией StackOverflow если вы включите свою лучшую попытку решить вашу проблему. В общем, используйте небольшой тестовый тест и просто используйте 'echo mv ....', пока не получите правильные имена Dir. ИЛИ, может быть, 'cd .../MP3; найти . -name '* .m4a' | xargs mv {} ../ M4A' (после выполнения этого M4A dir раньше времени). Удачи. – shellter

+0

Спасибо. Я не был уверен, что было бы целесообразно опубликовать мой неудачный сценарий. Я пробовал так много разных подходов, что здесь занял бы много места. Я рад за это направление. – Ergo

ответ

1
find /home/me/Music/MP3 -name \*.m4a| sed -e 's/.*/mkdir -p $(dirname "&"); mv "&" "&"M4A;/' | sed -e 's/MP3\([^"]*\)"M4A$/M4A\1"/' > moveit_baby.sh 
bash moveit_baby.sh 

должен выполнить эту работу, но перед тем как позвонить, отметьте «moveit_baby.sh».

В зависимости от вашей реализации sed вам понадобится \(\) или просто () во втором sed. Конечно, строка "MP3" не должна быть частью названия исполнителя, альбома или песни, иначе вам нужен более сложный фильтр, см. Ниже.

Дальнейшая оптимизация при вставке mkdir -p возможна только при изменении имени файла. Такие более сложные решения по входным параметрам лучше достигается при while read петель

find /home/me/Music/MP3 -name \*.m4a | while read file 
do 
    # do anything you want to $file here 
done 
+0

После некоторого исследования я считаю, что sed - это путь, но вышеприведенный код имеет ту же проблему, что и мой скрипт mv ... родительские и правые каталоги не становятся перемещенными/созданными. В приведенном выше коде есть суть переименования файлов с дополнительным «MP4» в конце песни и никогда не перемещается нигде. Поскольку мне не хватает ключевого элемента работы с каталогами, цикл, хотя и хорошая идея, еще нельзя использовать. Я изучу «sed» немного больше и опубликую, если придумаю решение. – Ergo

+0

, предполагая, что часть вашей проблемы связана с пробелами в именах файлов и dir. Обязательно dbl-quote использовать любое использование '' $ dir '' и '' $ file "' vars. Удачи. – shellter

Смежные вопросы