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

    Пока грипповирус подкашивает наши ряды (я уже выбыл из строя), страна празднует (у кого-нибудь стол таки был?) непонятные праздники, а Россия вот вот нападёт на Польшу (аааа), самое время упорядочить нашу коллекцию болванок %).
    Итак, возьмём в руки всю силу 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. Минусующие, отписывайтесь в хабрапочту или в комменты о причинах :)
    Поделиться публикацией
    Комментарии 9
      +1
      за скрипт спасибо, можно попробовать применить гдето, но упорядочевание коллекции дисков задача имхо для программ ориенторованных на это дело, а не для скрипта весом меньше килобайта…
        +1
        Не буду спорить, просто мне не пришлась по вкусу ни одна из уже реализованных программ именно тем, что не было нормального(консольного, хотя бы дополнительного) интерфейса и переносимость (вставил флешку куда хочу и получил данные — в доме 3 компьютера+роутер) хромала.
        0
        Для себя, несомненно ценный скрипт. Хотя немного функционала можно добавить. А вот например девушку свою я не смогу заставить регулярные выражения писать.
        Думается, если добавить к этому делу zenity, то можно будет сделать gui для всех и оставить консоль для себя =)

        З.Ы. Это не критика. Это мысли вслух =)
          0
          насчёт регулярок… простое слово(сочетание) тоже является валидной регуляркой:
          ./script.sh find 'something strange'

          [rap-kasta@acerAspire cdvdm-article]$ ./cdvdm.sh find 'The Simpsons'
          Поиск файла на диске
          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
          <ну и так далее>
          0
          Я в свое молодое время написал для себя утилитку, на Delphi + FireBird, конечно потяжелее вашей, не просто скриптик )) но идея идентична, и по мне так просто супер. Сунул диск -> просканил -> забыл. Когда надо — нашел что надо))
            +1
            Вы просто прочитали мои мысли!
            Не так давно у меня возникла точно такая же идея автоматизации процесса составленя каталога имеющихся в наличии дисков.
            Первое отличие состоит в том, что я живу на Windows, а не на Linux. Поэтому написал батник, а не bash.
            Второе отличие — я создаю не текстовые документы со списком всех файлов, а полный образ диска, только все файлы нулевого размера. В результате потом поиск можно осуществлять просто средствами OS (у меня — Total Commander, у вас — что-то типа find...).
            Итак, создаем bat-файл (скажем, AddToDB.bat) следующего содержания:

            @rem Входной параметр скрипта - название диска
            set NAME=%1

            @rem Здесь прописываем путь к нашей базе
            set DB=D:\Archive\Contents

            @rem Здесь указываем букву CD/DVD привода
            set DISK=E:\

            @FOR /R %DISK% %%i IN (.) DO @(
            for /f "tokens=1,2 delims=:" %%d in ("%%i") do @(

            md "%DB%\%NAME%%%e"
            )
            )

            @FOR /R %DISK% %%i IN (*.*) DO @(
            for /f "tokens=1,2 delims=:" %%d in ("%%i") do @(

            copy NUL "%DB%\%NAME%%%e"
            )
            )

            В нем нужно исправить путь, где вы собираетесь хранить свой список, и букву вашего CD/DVD привода.
            Запускаем так:

            AddToDB.bat НАЗВАНИЕ_ДИСКА

            Пояснения по скрипту:
            Первый цикл пробегается по всем каталогам диска и создает такую же структуру каталогов в архиве (внутренний цикл нужен лишь для того, чтобы «откусить» букву диска и приписать путь к архиву).
            Второй цикл пробегается по всем файлам диска и создаёт в архиве файлы с таким же названием нулевого размера.

            ЗЫ. Топик, наверное, интересен и пользователям длугих OS :)
              0
              Очень красива реализация (скопировал себе, вдруг чего...:), идея с копированием полной структуры тоже изначально возникала, но как возникла так и ушла :)

              >Топик, наверное, интересен и пользователям длугих OS :)
              надеюсь :)
                0
                >у меня — Total Commander, у вас — что-то типа find…
                Ну у нас тоже много хороших gui файл-менеджеров, например krusader последний просто красавчег)
                  0
                  Вместо файлов нулевого размера ещё лучше использовать симлинки.

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое