1

Тема: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Здравствуйте, для правильного перекодирования Lossless музыки (FLAC/APE), мне нужно отделить потрековые альбомы (несколько файлов FLAC/APE + CUE) от альбомов образами (один FLAC/APE + CUE), думал думал как это сделать и надумал, что нужно найти все папки, в которых есть CUE файл/файлы и один FLAC/APE файл, а уже потом разбираться с этими альбомами вручную.

Возможно ли написать такой BAT-ник, который бы это делал и сохранял имя корневой папки в текстовый файл, т.к. часто бывают такие варианты: M:\Исполнитель\Альбом\Файлы или M:\Альбом\Блаблабла\Номер диска\Файлы. Очень много разных вариантов глубины вложенности, поэтому не знаю, реально ли это.

2

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Опишите пример того и другого:

Zak пишет:

потрековые альбомы (несколько файлов FLAC/APE + CUE) от альбомов образами (один FLAC/APE + CUE)

3 (изменено: Zak, 2019-01-10 07:59:38)

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

alexii
Вот так обычно выглядит потрековый FLAC/APE альбом, но .CUE файлов бывает несколько или они вообще отсутствуют:

V:\Jazz\(2012) Fletcher Moss Park\01 - Cherry Blossom.flac
V:\Jazz\(2012) Fletcher Moss Park\02 - Fletcher Moss Park.flac
V:\Jazz\(2012) Fletcher Moss Park\03 - Mary Emma Louise.flac
V:\Jazz\(2012) Fletcher Moss Park\04 - Sailing Out to Sea.fla
V:\Jazz\(2012) Fletcher Moss Park\05 - Wee Lan (Little Orchid).flac
V:\Jazz\(2012) Fletcher Moss Park\06 - The Sun in September.flac
V:\Jazz\(2012) Fletcher Moss Park\07 - Finding My Way.flac
V:\Jazz\(2012) Fletcher Moss Park\Fletcher Moss Park.cue
V:\Jazz\(2012) Fletcher Moss Park\Folder.jpg
V:\Jazz\(2012) Fletcher Moss Park\Matthew Halsall - Fletcher Moss Park.log
V:\Jazz\(2012) Fletcher Moss Park\Matthew Halsall - Fletcher Moss Park.m3u

А вот так, альбом образом:

V:\Jazz\1963 - Impressions (Germany)\Covers
V:\Jazz\1963 - Impressions (Germany)\Coltrane - Impressions.ape
V:\Jazz\1963 - Impressions (Germany)\Coltrane - Impressions.wav.cue
V:\Jazz\1963 - Impressions (Germany)\Coltrane - Impressions.cue
V:\Jazz\1963 - Impressions (Germany)\Front.jpg
V:\Jazz\1963 - Impressions (Germany)\Impressions.log

И вот такие глубоко вложенные каталоги:

V:\Jazz\Zaz\2014. Zaz - Paris (2014, Limited Edition)\CD\Scans
V:\Jazz\Zaz\2014. Zaz - Paris (2014, Limited Edition)\CD\Zaz - Paris.flac
V:\Jazz\Zaz\2014. Zaz - Paris (2014, Limited Edition)\CD\Front.jpg
V:\Jazz\Zaz\2014. Zaz - Paris (2014, Limited Edition)\CD\Zaz - Paris.log
V:\Jazz\Zaz\2014. Zaz - Paris (2014, Limited Edition)\CD\Zaz - Paris.wav.cue
V:\Jazz\Zaz\2014. Zaz - Paris (2014, Limited Edition)\CD\Zaz - Paris.ISRC.cue
V:\Jazz\Zaz\2014. Zaz - Paris (2014, Limited Edition)\CD\Zaz - Paris.fix.cue
V:\Jazz\Zaz\2014. Zaz - Paris (2014, Limited Edition)\CD\Zaz - Paris.cue

4 (изменено: Rumata, 2019-01-10 09:58:49)

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Постановка задачи понравилась. Решил размять пальцы.


@echo off

setlocal

set "workdir=%~1"
if not defined workdir set "workdir=."

for /f "tokens=* delims=" %%f in ( '
	dir /b /s "%workdir%\*.cue"
' ) do for /f "tokens=*" %%n in ( '
	dir /b /s "%%~dpf\*.flac" "%%~dpf\.ape" ^| find /v /c ""
' ) do if %%~n equ 1 echo:%%~dpf

Описание:
1. для заданного каталога или текущего каталога выполняем поиск всех *.cue файлов
2. для каждого, найденного в п.1 файла в том же каталоге определяем количество *.flac/*.ape файлы
3. если значение, найденное в п.2 равно 1, вывести имя каталога

Недостатки:
1. не детектируется случай множества *.cue файлов в одном каталоге
2. предполагается, что один каталог содержит файлы только одного формата либо *.flac, либо *.ape, но не оба формата одновременно
2. алгоритм не тестировался

( 2 * b ) || ! ( 2 * b )

5

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Rumata
А как работает этот код? Он не сохраняет имена папок в файл? После отработки он просто закрывается.

6 (изменено: Rumata, 2019-01-10 19:48:17)

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Zak пишет:

А как работает этот код?

Я же дал описание. Как Вы читатете?

Zak
Нет, в файл не сохраняется, вывод производится только в консоль. Проверьте, убедитесь, что работает правильно.

( 2 * b ) || ! ( 2 * b )

7 (изменено: Zak, 2019-01-10 19:56:41)

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Rumata
Неправильно выразился, как работает понятно, но после отработки консоль закрывается и что получилось остаётся неизвестно. Хотя то, что успеваю увидеть, там всё правильно.

8 (изменено: Rumata, 2019-01-10 20:21:19)

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Zak пишет:

Хотя то, что успеваю увидеть, там всё правильно.

Откройте консоль в текущем каталоге и запустите скрипт. Ну если Вы убедились, что все работает правильно, вот Вам вариант с файлом -- рядом с батником создается одноименный текстовый файл (при каждом запуске перезаписывается). Отличия от предыдущей версии минимальны.


@echo off

call :main %* > "%~dpn0.txt"
goto :EOF

:main
setlocal

set "workdir=%~1"
if not defined workdir set "workdir=."

for /f "tokens=* delims=" %%f in ( '
	dir /b /s "%workdir%\*.cue"
' ) do for /f "tokens=*" %%n in ( '
	dir /b /s "%%~dpf\*.flac" "%%~dpf\.ape" ^| find /v /c ""
' ) do if %%~n equ 1 echo:%%~dpf

goto :EOF
( 2 * b ) || ! ( 2 * b )
+ Zak

9 (изменено: Zak, 2019-01-10 20:39:53)

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Rumata
Спасибо большое, на первый взгляд всё правильно, работает просто ультра быстро, и такой коротенький код.

Хотя в консоли бывает "Синтактическая ошибка в имени файла...", видимо проблема с именами в юникоде, но не уверен, надо проверять. А когда в папке несколько CUE, то в выходном TXT, имя указывается несколько раз, может это можно подчищать после отработки?

V:\Jazz\(2001) Dave Douglas - Witness\
V:\Jazz\(2001) Dave Douglas - Witness\
V:\Jazz\(2001) Dave Douglas - Witness\
V:\Jazz\(2001) Dave Douglas - Witness\

Ещё заметил такую забавную проблему, оказывается некоторые папки имеют в названии кириллическую букву "С" вот так (СD 1) и в файле получается (‘D 1").

10

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Zak пишет:

"Синтактическая ошибка в имени файла...", видимо проблема с именами в юникоде

Zak пишет:

оказывается некоторые папки имеют в названии кириллическую букву "С"

Возможно. Возможно, что это проявления одной проблемы.

Полагаю, что коллеги по форуму подскажут решение это проблемы, например, выставить chcp 1251 непосредственно перед выводом в файл.

Zak пишет:

А когда в папке несколько CUE, то в выходном TXT, имя указывается несколько раз, может это можно подчищать после отработки?

Это надо решить на этапе формирования списка. В юниксах есть хорошая команда uniq, которая удаляет дубликаты. В случае виндоуз -- надо решать с привлечением допролнительных средств, например jscript.

( 2 * b ) || ! ( 2 * b )

11 (изменено: Zak, 2019-01-10 21:33:11)

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Rumata
Да, именно в кодировке проблема, папки с именем такого вида: "Noël Akchoté – Perpetual Joseph", скрипт не может проверить. Жаль, что в Шиндовс всё так сложно, ждём, может кто-нибудь знает решение этих проблем.

12

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Давайте посмотрим расшренную версию скрипта:


0</*! ::
@echo off

for /f "tokens=2 delims=:" %%c in ( 'chcp' ) do set "cp=%%~c"

chcp 1251
call :main %* > "%~dpn0.txt"
chcp %cp%

goto :EOF

:main
setlocal

set "workdir=%~1"
if not defined workdir set "workdir=."

for /f "tokens=* delims=" %%f in ( '
	dir /b /s "%workdir%\*.cue" ^| cscript //nologo //e:javascript "%~f0"
' ) do for /f "tokens=*" %%n in ( '
	dir /b /s "%%~ff\*.flac" "%%~ff\.ape" ^| find /v /c ""
' ) do if %%~n equ 1 echo:%%~ff

goto :EOF

*/0;

var seen = {};

while ( ! WScript.StdIn.AtEndOfStream ) {
	var dir = WScript.StdIn.ReadLine().replace(/\\[^\\]+$/, "");
	seen[dir] = 1;
}

for (var p in seen) {
	WScript.StdOut.WriteLine(p);
}

Алгоритм обработки несколько изменился:
1. для заданного каталога или текущего каталога выполняем поиск всех *.cue файлов, выделяем имена каталогов и удаляем дубликаты (используется jscript)
2. для каждого, найденного в п.1 файла в том же каталоге определяем количество *.flac/*.ape файлы
3. если значение, найденное в п.2 равно 1, вывести имя каталога

Возможные улучшения:
1. Решена прооблема множества *.cue файлов в одном каталоге
2. Возможно решена проблема кириллических символов

( 2 * b ) || ! ( 2 * b )

13 (изменено: Zak, 2019-01-10 21:52:36)

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Rumata
Респект, дублирование побеждено, но кириллица стала отображаться абракадаброй, что в консоли, что в выходном файле. Может быть лучше даже убрать chcp 1251, знак ‘ легче сдетектить глазами? Проблема с юникодными именами папок вроде "Noël Akchoté", естественно осталась.

14

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Zak, уберите (или закомментируйте) все строки, содержащие подстроку chcp (таких строк всего три).

( 2 * b ) || ! ( 2 * b )

15

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Rumata
Ок, понял, спасибо.

А что значат в консоли строчки "Системе не удаётся найти указанный путь", здесь вроде бы не в юникоде дело?

16 (изменено: Rumata, 2019-01-10 22:56:36)

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Не знаю. Не могу сказать.

( 2 * b ) || ! ( 2 * b )

17 (изменено: Zak, 2019-01-11 06:54:08)

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Rumata
Удалось решить проблему с кодировками и кириллицей, с помощью AutoHotKey. Оказывается консоль не дружит со спец-символами-буквами.

18 (изменено: wisgest, 2019-01-13 19:50:50)

Re: CMD/BAT: Найти все папки с .CUE файл-ом/ами и !одним! FLAC/APE файлом

Оказывается консоль не дружит со спец-символами-буквами.

Как бы да, но как бы и нет.
Я не вникал в код в этой теме. Но в общем случае можно заметить следующее.

Во-первых, если в качестве шрифта консоли указан используемый по умолчанию Terninal, то в окне консоли многие символы не будут правильно отображаться по определению, особенно при переключении кодировки (на результат перенаправления в файл это не влияет). У меня, кстати, стоит Courier New:

REGEDIT4
[HKEY_CURRENT_USER\Console]
"FaceName"="Courier New"
"FontFamily"=dword:00000036
"FontWeight"=dword:00000190
"FontSize"=dword:00110000

Во-вторых, можно вспомнить про ключ /U у CMD и CSCRIPT (используется в сообщении 2019-01-10 21:38:13).

В третьих, UTF-8

chcp 65001

в более новых выпусках CMD свободно работает в командных файлах, в более старых (для Win XP) — с костылями.

В четвёртых, мне не понятно в чём преимущество вызова ещё одного процесса CMD.EXE (именно так и искажается кодировка):

for /f "tokens=* delims=" %%f in ('dir /b /s "%workdir%\*.cue"') do

вместо

for /r "%workdir%" %%f in ("*.cue") do
+ Zak