Переименовать подпапку: добавить начальное слово из родительской папки

У меня есть большая музыкальная библиотека, организованная в Artist папки с Album подпапки:

Artist 1
- Album A
-- File 1
-- File 2
- Album B
-- File 1
-- File 2
Artist 2
- Album C
-- File 1
-- File 2
- Album D
-- File 1
-- File 2

Теперь я хочу переименовать все Album папки, добавив Artist назвать как префикс И переместить все Album папки в корневой каталог, вот так:

Artist 1 - Album A
- File 1
- File 2
Artist 1 - Album B
- File 1
- File 2
Artist 2 - Album C
- File 1
- File 2
Artist 2 - Album D
- File 1
- File 2

Каков наилучший способ сделать это? Я пытался сделать это с Total Commander, но я не понимаю. Или, возможно, shell, mp3tag? Я использую Windows 10. Спасибо!

3 ответа

Решение

Я нашел ответ сам. Лучший способ сделать это - использовать инструмент mp3tag. Вы можете создавать новые папки и копировать в него свои файлы.

  1. Выберите Converter > Tag - Filename

  2. Введите:

    E:\%artist% - %album%\$num(%track%,2) - %title%
    

Вы получите каталог с Artist - Albumname\01 - File.mp3

Это легко сделать с помощью C#, но тогда вам понадобится Visual Studio, которую можно бесплатно скачать: https://info.microsoft.com/FR-VSO-CNTNT-FY16-10Oct-15-VisualStudioCommunity-Register.html

На самом деле это можно сделать несколькими способами. Я покажу, как в bash, но это только если у вас есть эта штука Bash на Ubuntu на Windows. Снова:

BASH

Предполагая, что ваша музыкальная библиотека ~/Music/то, что все папки исполнителей находятся внутри, что вы соглашаетесь с тем, чтобы все было перемещено в новую папку, при условии, что она еще не существует (потому что, если у вас была папка исполнителя с именем "CoolSinger" и просто случайно у вас также есть другая папка исполнителя с именем 'CoolSinger - CoolAlbum', по ошибке, будут проблемы...), и что нет никаких других вовлеченных файлов, кроме того, что вы заявляете, сценарий оболочки будет выглядеть так:

#!/bin/bash

mkdir ~/NewMusic/
for artistdir in ~/Music/*; do
  artistname="$(basename "${artistdir}")"
  for albumdir in "${artistdir}"/*; do
    albumname="$(basename "${albumdir}")"
    mv "${albumdir}" ~/NewMusic/"${artistname} - ${albumname}" 2>/dev/null
  done
done

И позвольте мне объяснить это по-человечески:

Создайте папку назначения. Тогда для каждого artist (при условии, что все являются папками); перебирать каждый album подпапку, перемещая ее в новую папку и, кстати, переименовывая ее, используя имя исполнителя и имя папки из фактических имен папки. Если бы все прошло хорошо, это привело бы к:

  • Папка ~/Music/ с исходными именами подпапок, но теперь они пусты.
  • Папка ~/NewMusic с желаемой структурой.
  • Если папка Artist пуста, оболочка попытается выдать ошибку, потому что она расширяется до буквальной строки (объяснено позже), но не беспокойтесь, потому что, если она пуста, то все, что с этим связано, так что вы можете игнорировать это, добавляя 2>/dev/null в команду. Однако, если с этим что-то пойдет не так, оно также будет заставлено замолчать.

Если вы хотите, скажем, остаться с оригинальными файлами, and иметь копию всего этого с желаемой структурой, вы должны изменить mv команда для cp -R один.

И все это для сценария, в файле. Если вы хотите выполнить его прямо из командной строки, что может несколько усложнить изменение имени папки для музыкальной библиотеки, это будет выглядеть так:

mkdir ~/NewMusic/; for artistdir in ~/Music/*; do artistname="$(basename "${artistdir}")"; for albumdir in "${artistdir}"/*; do albumname="$(basename "${albumdir}")"; mv "${albumdir}" ~/NewMusic/"${artistname} - ${albumname}"; done; done

И объяснение всего там есть:

  1. mkdir создает каталог.
  2. for A in B ; do C ; done это петля. Он проходит по каждой строке, разделенной одним из символов IFS в Bи назначьте его как значение для переменной Aпока он выполняет C,
    • Обратите внимание, что текст в сценарии имеет звездочку. Оболочка расширяет строку со звездочкой до того, что она находит в соответствии с шаблоном. Например, если у вас была куча документов Word, наберите echo *.docx будет расширяться до каждого имени, соответствующего этому концу, в текущей папке (в другом случае, echo /path/*.docx).
  3. Таким образом, для каждой папки в указанном каталоге назначьте (один раз для каждой папки Artist) переменную artistname с указанием базового имени файла (в данном случае, папки) в качестве его значения. Так, basename /path/to/anything возвращается anything,
  4. С помощью другого for цикл, сделать для каждого элемента в каталоге Artist, переименуйте его, как указано, и если новое имя находится в другом каталоге, он будет перемещать его туда.
    • Опять же, 2>/dev/null перенаправление там, чтобы перенаправить весь вывод в stderr в пустоту. Выход в stdout Тем не менее, все равно будет напечатан, если таковые были.

НЕКОТОРЫЕ ВАЖНЫЕ ЗАМЕЧАНИЯ

  • Я понятия не имею, обнаруживает ли оболочка из Bash на Ubuntu на Windows /dev/null как файл специальных символов, который есть на стандартном компьютере UNIX или нет. Скорее всего, это так, или это не будет совместимо со многими вещами.
  • Это только в том случае, если в вашей Windows 10 установлен Bash на Ubuntu для Windows. Если я правильно помню, возможность его использования была реализована с помощью Anniversary Update. Если у вас есть обновление, но нет bashЯ рекомендую вам установить его. Есть несколько руководств по этому вопросу в Интернете.
  • О структуре папок. Я подозреваю то же самое о /dev/null Что касается структуры папок POSIX: то, что ей следует, это не только Bash в Windows, но и Bash в Ubuntu в Windows.
Другие вопросы по тегам