Pull to refresh

Упорядочиваем диски скриптом весом меньше килобайта

Reading time5 min
Views1.1K
Пока грипповирус подкашивает наши ряды (я уже выбыл из строя), страна празднует (у кого-нибудь стол таки был?) непонятные праздники, а Россия вот вот нападёт на Польшу (аааа), самое время упорядочить нашу коллекцию болванок %).
Итак, возьмём в руки всю силу cat'а, grep'а, sed'а и bash'а и напишем маленький но очень полезный скриптик.


Вводное слово



У вас наверняка много-много болванок. Я вот их использую, для того чтобы сливать на них всё то добро, что накапливается на диске: от любимых мной Симпсонов и прослушанных подкастов до просто отвратного рэпа «репера Сявы», просто потому что мне жаль потраченного трафика и я хочу чтобы потраченные на него деньги имели материальное воплощение в виде заполненных секторов на dvd-диске.
Но бывает найти что-либо среди сотен дисков очень сложно, потому на помощь приходят «каталогизаторы». Долгое время я смотрел на экземляры существующих особей, но в конце концов понял — НЕ ТО! Мне нужно простое средство: одна команда на добавление диска, другая на поиск. Мне не нужен gui, ибо вполне может случиться такая ситуация, когда гуя под рукой не будет (хе), а диск нужно таки найти: не хочу включать бук, вставляю флешку с базой в роутер, захожу по ssh на него и нахожу нужный диск и отдаю его знакомому, а если флеха будет уже расшарена, то вообще отлично.

Прелюдия закончена, теперь немного кода.
Я приведу сюда весь набранный мною скрипт — он прост до абсурда, а после этого объясню важные моменты его работы.

#!/bin/bash
#special for habra-users from [r-k] (rapkasta on habrahabr.ru)
dbDir="/home/rap-kasta/Documents/cdvdm-article/db/"

if [ $# -lt 1 ]; then
echo "Требуется указать хотя бы действие..."
exit 1
fi

case "$1" in
"add" )
echo "Добавление диска"
if [ $# -ne 3 ]; then
echo "Неверное количество параметров"
fi

find $2 > "${dbDir}${3}"

;;

"find" )
echo "Поиск файла на диске"
if [ $# -ne 2 ]; then
echo "Неверное количество параметров"
fi
grep -H -i -P "${2}" ${dbDir}*|sed "s|${dbDir}||"
;;

"help" )
echo "Справка. Возможны следующие запросы:"
echo "1)Добавление диска: add ПУТЬ_ДО_ДИСКА ИМЯ_ДИСКА"
echo "2)Поиск диска(файла): find ШАБЛОН_ПОИСКА"
;;
* )
echo "Неизвестное действие $1"
;;
esac


Итак, пройдёмся по пунктам.

Как у нас будет выглядеть база дисков



Всё очень просто: база-это отдельная директория, которая указывается в начале скрипта, файлы внутри директории — диски, чьи имена соответствуют именам дисков, а содержимое файлов — файловое дерево диска.
Таким образом, у нас есть возможность удалять и «править» диски ручками, хотя если вам сильно захочется — можете добавить функции удаления и правки прямо в скрипт: сделать rm или запрос к любимому текстовому редактору так же легко как сделать добавление файлов.

Добавление файлов



Воспользуемся великой и могучей программой find, которая, если не указывать ничего лишнего, с удовольствием отдаст нам все файлы внутри директории:

find ОТКУДА_БРАТЬ_ФАЙЛОВУЮ_СТРУКТУРУ > КУДА_ЕЁ_ЗАПИСАТЬ


Как мы уже выяснили, имя файла в базе дисков — это имя диска. Следуя здравой логике, имя диска не должно содержать ничего противозаконного (слэш и — в силу субъективных обстоятельств — прямую черту ("|") ) и должно быть уникальным для диска. Если же у вас много диском с названием «Немецкая Классика», то можно собрать все эти диски в стопку и добавить фломастером к имени каждого порядковый номер: «Немецкая Классика #67».

После добалвения диска, он складывается в стопочку/забрасывается далеко-далеко и через пару месяцев внезапно в нём возникает надобность. Правда уже забыли в каком «в нём».

Поиск файлов



Предположим вы, как и я, цените творчество Гроенинга и внезапно захотели пересмотреть весь 18й сезон его Смешариков. Для этого нам понадобится mplayer, но сначала таки найдём куда мы закинули этих самых круглых монстров, а поможет нам в этом команда find:

find -H -i -P Перловая_Регулярка ГДЕ_ИЩЕМ


Для того чтобы использовать регулярные выражения, мы добавляем -P к запросу find, а -H выведет нам имя файла в котором была найдена нужная подстрока, -i сделает запрос нечувствительным к регистру.
Есть минус: в выводе find покажет полный путь к найденным файлам, потому нам нужно убрать постоянно повторяющийся путь до базы, в чём нам поможет любимый всеми текстовый редактор SED:

echo "Что-то"|sed 's/то/меняем на сё/'


Как видите, мы не будем использовать никаких отдельных ключей и модификаторов — sed ищет построчно, это нам и нужно.

Ах да, смешарики...
[rap-kasta@acerAspire cdvdm-article]$ ./cdvdm.sh find 'Simpsons(.+)18(x|e)(.+)\.(avi|srt)'
Поиск файла на диске
Archive #10:/media/cdrom/Simpsons/The Simpsons [18x07] Ice Cream Of Margie With The Light Blue.avi
Archive #10:/media/cdrom/Simpsons/The Simpsons [18x08] The Haw-Hawed Couple.avi
Archive #10:/media/cdrom/Simpsons/The Simpsons [18x09] Kill Gil - Vols. 1 And 2.avi
Archive #10:/media/cdrom/Simpsons/The Simpsons [18x10] The Wife Aquatic.avi
Archive #10:/media/cdrom/Simpsons/The Simpsons [18x11] Revenge Is A Dish Best Served Three Tim.avi
Archive #10:/media/cdrom/Simpsons/The Simpsons [18x12] Little Big Girl.avi
Archive #10:/media/cdrom/Simpsons/The Simpsons [18x13] Springfield Up.avi
Archive #10:/media/cdrom/Simpsons/The Simpsons [18x14] Yokel Chords.avi
Archive #10:/media/cdrom/Simpsons/s18e07.srt
Archive #10:/media/cdrom/Simpsons/s18e08.srt
Archive #10:/media/cdrom/Simpsons/s18e09.srt
Archive #10:/media/cdrom/Simpsons/s18e10.srt
Archive #10:/media/cdrom/Simpsons/s18e11.srt
Archive #10:/media/cdrom/Simpsons/s18e12.srt
Archive #10:/media/cdrom/Simpsons/s18e13.srt
Archive #10:/media/cdrom/Simpsons/s18e14.srt
Archive #9:/media/cdrom/Simpsons/s18e06.srt
Archive #9:/media/cdrom/Simpsons/s18e05.srt
Archive #9:/media/cdrom/Simpsons/s18e04.srt
Archive #9:/media/cdrom/Simpsons/s18e03.srt
Archive #9:/media/cdrom/Simpsons/s18e02.srt
Archive #9:/media/cdrom/Simpsons/s18e01.srt
Archive #9:/media/cdrom/Simpsons/The Simpsons [18x06] Moe 'N' A Lisa.avi
Archive #9:/media/cdrom/Simpsons/The Simpsons [18x05] G.I. (Annoyed Grunt).avi
Archive #9:/media/cdrom/Simpsons/The Simpsons [18x04] Treehouse Of Horror XVII.avi
Archive #9:/media/cdrom/Simpsons/The Simpsons [18x03] Please Homer, Don't Hammer 'Em.avi
Archive #9:/media/cdrom/Simpsons/The Simpsons [18x02] Jazzy And The Pussycats.avi
Archive #9:/media/cdrom/Simpsons/The Simpsons [18x01] The Mook, the Chef, the Wife, and Her H.avi


Ин конлюжн


Если у вас есть какие-то идеи по усовершенствованию, то думаю запостить три-четыре строчки кода в комментарий будет не очень плохой идеей :)
Надеюсь я помог вам упорядочить вашу коллекцию дисков. Себе же я помог ещё и чуть отвлечься от болезни и то хорошо :)

P.S. Хабрапользователем ystein в комментарии была предложена отличная идея и реализация (для Windows) хранения дампа дисков, которая переносит такие функции как поиск на уже существующие файл-менеджеры.

P.P.S. Минусующие, отписывайтесь в хабрапочту или в комменты о причинах :)
Tags:
Hubs:
+3
Comments9

Articles

Change theme settings