Loading...
Error

Выборки. В помощь раздающему.

Ответить на тему

 | 

 
Автор Сообщение

Drunkenmunky

Задача.
Есть директория содержащая множество(сотни тысяч) файлов и папок.
Необходимо создать торрент-файл содержащий только некоторые из них(то есть сделать выборку). Например по списку.
Даже самый из продвинутых торрент-клиентов (в настоящее время) не может предоставить нам такой возможности.
Поэтому придется как-то исхитриться.
Выхода тут ровно два: скопировать необходимые файлы в отдельную директорию(что неизбежно приведет к переполнению дискового пространства, так как таких раздач мы собираемся создать несколько), либо созданием ссылок на эти файлы(методом тыка выяснено, что ссылки символические для этого не подходят - торрент-клиент отказывается их добавлять). Поэтому мы будем использовать жесткие ссылки.
Простейший пример жесткой ссылки на файл сделанной утилитой ln.exe из командной строки(Win XP):

Код:

ln.exe G:\Files\Flibusta.FB2\2007\12\01\94574.fb2.zip G:\Files\custom\2007\12\01\94574.fb2.zip
Для Win 7 и выше пример выглядит несколько по иному. Вроде бы начиная с Висты доступна команда mklink:

Код:

mklink /H G:\Files\custom\2007\12\01\94574.fb2.zip G:\Files\Flibusta.FB2\2007\12\01\94574.fb2.zip
Её особенность в том, что порядок вводных изменен(сначала ссылка, потом объект)
Кроме того папка G:\Files\custom\2007\12\01 из примера, должна существовать

Код:

mkdir G:\Files\Flibusta.FB2\2007\12\01


Замечательно. Но, не будем же мы из-за каждого файла открывать командную строку. А ведь если поместить эту же команду в файл с раширением .bat, получим некий сценарий исполняемый двойным кликом по этому файлу.
Осталось заполнить этот "батник" другими аналогичными командами.
Например:

Код:

ln.exe G:\Files\Flibusta.FB2\2007\12\01\94574.fb2.zip G:\Files\custom\2007\12\01\94574.fb2.zip
ln.exe G:\Files\Flibusta.FB2\2007\12\01\94576.fb2.zip G:\Files\custom\2007\12\01\94576.fb2.zip
ln.exe G:\Files\Flibusta.FB2\2007\12\01\94577.fb2.zip G:\Files\custom\2007\12\01\94577.fb2.zip
ln.exe G:\Files\Flibusta.FB2\2007\12\01\94581.fb2.zip G:\Files\custom\2007\12\01\94581.fb2.zip
и т.д.

Предположим, что нам требуются книги только одного какого-нибудь жанра. Информацию об этом будем брать из базы данных ("коллекции") программы Myhomelib.
Сама программа нам здесь мало чем поможет, а вот её файл коллекции прекрасно открывается, по крайней мере на чтение, менеджерами баз данных SQLite.
Так как для этих целей я пользуюсь программой SQLiteStudio, то для примеров будем использовать её. Уверен, что большая часть из них подойдет и для других менеджеров.
Скопируем файл коллекции(файл с расширением .hlc2 из папки Data программы Myhomelib) куда-нибудь в удобное место, но уже с расширением .db3. Так его будет проще открыть SQLiteStudio.
Далее откроем SQLiteStudio>Базы данных>добавить базы данных>наш файл .db3
А в ней таблицу Books, большая часть необходимой нам информации находится в ней.
Осталось её соответствующим образом отсеять. Наглядней всего это сделать в так называемом представлении(Представления>новое представление). Назовем его для примера det.
Поместив в него выполняемый для получения данных код(sql запрос):

Код:

SELECT * FROM Books WHERE KeyWords LIKE '%det%'
В списке таблиц, чуть ниже его, есть список представлений. Там найдем созданное нами представление det. С отсеянным списком книг в ключевых словах которых имеется тег "det". Если коллекция создавалась с помощью "расширенного" INPX, то в нем такая информация присутствует.
Но нас ведь интересуют детективы только на русском языке, при этом они не должны быть "удаленными".
Откроем представление для редактирования и усложним запрос.

Код:

SELECT *
FROM Books
WHERE KeyWords LIKE '%det%'
AND Lang = 'ru'
AND IsDeleted != 1


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

Код:

SELECT Folder, FileName
FROM Books
WHERE KeyWords LIKE '%det%'
AND Lang = 'ru'
AND IsDeleted != 1


Кто-то скажет: это всё прекрасно, на нам нужен готовый батник, с полными путями к файлам и будущим ссылкам.
OK, сейчас сделаем:

Код:

SELECT 'ln.exe G:\Files\Flibusta.FB2\'||`Folder`||`FileName`||' G:\Files\custom\'||`Folder`||`FileName`
FROM `Books`
WHERE `KeyWords` LIKE '%det%'
AND `Lang` = 'ru'
AND IsDeleted != 1
Для формирования командного файла с директориями пригодится примерно такой запрос

Код:

SELECT DISTINCT 'mkdir G:\Files\custom\'||`Folder`
FROM `Books`
WHERE `KeyWords` LIKE '%det%'
AND `Lang` = 'ru'
AND IsDeleted != 1


Осталось экспортировать это представление как csv, переименовав его затем в расширение .bat.

Данный текст может быть дополнен, если кому-то понадобятся более сложные выборки - по авторам, сериям, отдельным поджанрам. Выборки несовместимые с основной раздачей, то есть именами ссылок не совпадающих с именами файлов. И т.д.
Для интересующихся SQL запросами, в частности в SQLite, рекомендую книгу Б.Форта "SQL за 10 минут".
Показать сообщения:    
Ответить на тему