Переименовать подпапку: добавить начальное слово из родительской папки
У меня есть большая музыкальная библиотека, организованная в 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. Вы можете создавать новые папки и копировать в него свои файлы.
Выберите Converter > Tag - Filename
Введите:
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
И объяснение всего там есть:
mkdir
создает каталог.for A in B ; do C ; done
это петля. Он проходит по каждой строке, разделенной одним из символов IFS вB
и назначьте его как значение для переменнойA
пока он выполняетC
,- Обратите внимание, что текст в сценарии имеет звездочку. Оболочка расширяет строку со звездочкой до того, что она находит в соответствии с шаблоном. Например, если у вас была куча документов Word, наберите
echo *.docx
будет расширяться до каждого имени, соответствующего этому концу, в текущей папке (в другом случае,echo /path/*.docx
).
- Обратите внимание, что текст в сценарии имеет звездочку. Оболочка расширяет строку со звездочкой до того, что она находит в соответствии с шаблоном. Например, если у вас была куча документов Word, наберите
- Таким образом, для каждой папки в указанном каталоге назначьте (один раз для каждой папки Artist) переменную
artistname
с указанием базового имени файла (в данном случае, папки) в качестве его значения. Так,basename /path/to/anything
возвращаетсяanything
, - С помощью другого
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.