Пытаюсь починить папку с музыкой, то что itunes напортачил.

Итак, мне нужен скрипт для перемещения файлов из:

Музыка\Исполнитель\Название альбома\Исполнитель - название.mp3

Чтобы переместить файлы в

Newmusic\Название альбома\Исполнитель - title.mp3.

Я пробовал строку ниже, но не работал.

find music -type f -exec bash -c 'ext="${0##*.}"; base="$(basename "$0" ."${ext}")"; dirs="$(dirname "$0" | cut -d '/' -f 2,3)"; new="newmusic/${dirs}/${base}.${ext}"; cp "$0" "${new}"' {} \;

Должен ли "cut -d '/' -f 2,3" быть в new="newmusic/${{dirs} cut -d '/' -f 2,3}/ Кто-нибудь может помочь? Заранее спасибо..

2
dacool 13 Фев 2011 в 18:14
Это больше похоже на что-то для Super User.
 – 
Cristian Ciupitu
13 Фев 2011 в 19:43

4 ответа

Я что-то здесь упускаю или mv не могу добиться того, чего вы хотите? Исходя из вашего вопроса, это должно работать:

mv music/*/* newmusic/
2
Simon Whitaker 13 Фев 2011 в 18:26
"-bash: /bin/mv: Слишком длинный список аргументов." А если просто использовать команду mv, она не удаляет 2 подпапки (Artist)?
 – 
dacool
13 Фев 2011 в 18:50
for artist in music/*; do
  if [[ -d "$artist" ]]; then
    for album in $artist/*; do
      mv "$album/*" "newmusic/${album##*/}/"
    done
  fi
done
1
pepoluan 8 Мар 2011 в 07:54

Трюки, просто избегайте '-exec bash -c', вы получите нечитаемый защищенный код с чрезмерными кавычками.

Вместо этого играйте с:

find -name .mp3 | while read file
do
    # Play with "$file"
    # Don't play with $file without doubles quotes, keep spaces in mind
    # Don't play with '$file', it'a common error ^^
done
1
Julien Palard 20 Мар 2011 в 16:36

1.cd в ваш рабочий каталог

2.find music/Artist -type d -maxdepth 0 -exec mv {} newmusic/ \; должно помочь.

Если вы не хотите использовать mv, вы можете заменить mv на cp -r.

0
Shinnok 13 Фев 2011 в 19:03
Артист меняет атрибут, артистов много, всех не набрать. Между именами некоторых папок также есть пробел, например, music/Artist\ /x/. Нам нужно for перед этой командой, но почему-то она тормозит строки, когда в имени папки есть пробел. Даже при использовании ls -1, например: for f in $( ls -1 music ); найдите музыку/$f -type d -maxdepth 0 -exec echo {} newmusic/ \; Выполнено
 – 
dacool
13 Фев 2011 в 21:02
Find * -type d -mindepth 1 -exec cp -r {} ../newmusic/ \; сработало, спасибо за указание правильного пути :)
 – 
dacool
14 Фев 2011 в 00:25