Организация локального поиска файлов через locate — дешево и сердито

2017-02-10

В командной строке есть утилита locate, которая ежедневно сканирует файловую систему с помощью утилиты updatedb и позволяет быстро находить файлы на диске по названию. Мне часто удобнее искать не по всему диску, а только по домашней директории или вообще по каким-то отдельным папкам. Обычно я использую find, но, читая man updatedb я обнаружил что поиск можно организовать в локальную базу таким вот образом:

updatedb -l 0 -o db_file -U source_directory

db_file — куда сохранять, source_directory — что сканировать.

Захотелось сделать свой локальный кэшируемый поисковик. Задача — сканировать домашнюю папку /home/vik, кэш хранить в /home/vik/.local/share/mlocate.db (еще одна полезная папка — ~/.local) и иметь возможность задать не locate а «local locate» — llocate.

Сделал отдельный скрипт на сканирование диска:

~/bin/locate/local_updatedb

С содержимым:

#!/bin/sh
updatedb -l 0 -o /home/vik/.local/share/locate.db -U /home/vik -n ".git .bzr .hg .svn .dropbox.cache"

Расшифровка ключей:

-l 0 не проверять права на доступ к базе данных

-o — где сохранить базу данных

-U — что сканировать

-n — какие имена игнорировать (очень удобно, чтобы не получать в поиске имен из папок контроля версий).

Дал скрипту права на запуск:

$ chmode a+x ~/bin/locate/local_updatedb

Обновлялку вынес в крон:

$ crontab -e

и вписал в файл:

@reboot /home/vik/bin/locate/local_updatedb 

«на каждой перезагрузке запускать сканирование диска»

Внимание: если вы редактируете crontab-файл — в конце нужно обязательно оставить пустую строку — иначе не заработает.

Последний штрих — добавил alias llocate в ~/.bash_aliases

alias llocate='locate -d /home/vik/.local/share/mlocate.db'

Пример:

vik@firefly:~$ llocate Войников

/home/vik/av/mp3/Виктор Войников - Честный стрелок.mp3
/home/vik/av/mp3/1_сборки/pulsar/Модель Для Сборки - Виктор Войников - Резонанс.mp3
/home/vik/book/hub/одессика/1914_Вся Одесса_Войников_737.png
...
/home/vik/zbox/yandex/Яндекс.Фотки/memorial Войников_new.jpeg.jpg

Комментирование в markdown и однострочниках bash файлов

2015-10-21

LUKE: Is Perl better than Python?
YODA: No… no… no. Quicker, easier, more seductive.
LUKE: But how will I know why Python is better than Perl?
YODA: You will know. When your code you try to read six months from now.

(c)

Хороший код (и хороший текст) всегда должен быть откомментирован. В последнее время я много пишу на markdown’не, который по ходу дела обрабатывается pandoc’ом и sed’ом, причем все это сведено в один makefile, который со временем разрастается до довольно больших размеров. Читать далее…


FBReader — чтение и допиливание

2015-07-05

Некоторое время назад перешел с CoolReader на FBReader — польстившись главным образом на сетевую систему синхронизации (которая до сих пор работает у них с каким-то скрипом). В принципе помимо системы синхронизации выяснилось, что FB за прошедшее время допилен до вменяемого состояния, в то время, как CoolReader практически не обновляется — поэтому, оставив обе программы, сейчас пользуюсь FB.

Неудобств у этой софтины пока всплыло два.

Первое — она категорически не хочет открывать .fb2.zip файлы, считая их прерогативой CoolReader. К счастью, есть человек, который не поленился сделать костыль к этому, что сильно облегчило работу с системой.

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

Скажем Кутузов Лидии Ивченко выкачивается не как Ivchenko_Zhizn-zamechatelnyh-lyudey_1372_Kutuzov.335158.fb2.zip, а как целое дерево вложенных папок: <родная папка fbreader'а>/flibusta.net/b/335158.zip, что ужасно неудобно.

Моя система хранения книг опирается в первую очередь на файловую систему — осмысленные названия файлов и иерархия папок по которым эти файлы тасуются. Ничего более удобного пока нет и, скорее всего, не будет придумано в ближайшее время. Иерархия “папка-файл” выглядит скучновато в отличие от всяческих all-inside хранилищ типа Calibre или той же встроенной библиотеки FBReader, зато надежна, минимальна по занимаемому месту, вообще не требует стороннего софта для упорядочивания, хорошо упорядочивается дельта-итерациями (тема отдельного разговора) и — как я начинаю понимать — нейрологически обоснованна (очень рекомендую такую книгу, как Daniel J. Levitin “The Organized Mind Thinking Straight in the Age of Information Overload” — написано хорошо, не заумно, без утомляющего выпендрежа и по делу).

Поэтому 335158.zip меня не устраивал категорически, хотя сам OPDS-доступ к сетевой библиотеке (т.е. скачивание книги через FBReader) оказался вполне удобным. Первым делом я попробовал переименовывать файлы вручную и раскладывать их по своим папкам — меня хватило файла на два.

К счастью, быстро выяснилось, что внутри у скачанного 335158.zip лежит вполне приличный по названию Ivchenko_Zhizn-zamechatelnyh-lyudey_1372_Kutuzov.335158.fb2 — дальше дело заключалось в написании простенького скрипта:

#!/bin/bash
# основная идея избавиться от закачки безымянных файлов с флибусты

# находит и раззиповывает в корень файлы в каталогах
find . -type f -name "*.fb2.zip" -exec unzip {} \;

Простенький однострочник на самом деле — find спускается вниз по дереву папок, находит файлы (-type f), которые заканчиваются на .fb2.zip (-name "*.fb2.zip") и запускает unzip, который над ними операцию распаковки (-exec unzip {} \; — вместо {} подставляется имя найденного файла). Разумеется, чтобы это работало, в системе должен быть установлен unzip (у меня он стоит по умолчанию — если его нет надо сделать что-нибудь типа sudo apt-get install unzip)

Этот файл (unzipper.sh) был положен в корень (то, что выше названо <родная папка fbreader'а>) и — дррррр! — тридцать файлов, которые к тому времени скопились в дереве папок, оказались найдены, раззипованы и аккуратно сложены в папке со скриптом.

На этом можно было бы остановиться — FBReader в принципе читает и раззипованный .fb2, но почему бы не упаковать все назад в зип? Для этого нужен примерно такой однострочник:

find . -type f -name '*.fb2' -exec zip '{}'.zip '{}' \;

Находим файлы, которые оканчиваются на .fb2 и зипуем их. -exec zip '{}'.zip '{}' \; выполнит операцию zip (он тоже должен быть в системе — sudo apt-get install zip) и подставит в нее найденные название файла ({}) и имя новосоздаваемого архива ({}.zip — старое имя + расширение .zip).

Итого:

#!/bin/bash
# основная идея избавиться от закачки безымянных файлов с флибусты

# находит и раззиповывает в корень файлы в каталогах
find . -type f -name "*.fb2.zip" -exec unzip {} \;

# зипует их обратно
find . -type f -name '*.fb2' -print -exec zip '{}'.zip '{}' \;

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


Система бэкапов mysql moodle на двух машинах через scp ssh

2013-12-27

После вчерашнего танца с бубнами… Гм. Лучше по порядку. Вчера вышел из строя основной сервер. Я запустил резервный сервер, перекинул коммутацию интернетов в обход сервера. Этим я обеспечил интернеты. Потом поднял из бэкапов мудл, который у нас основным рабочим продуктом.

В более-менее спокойной обстановке народ разобрался с основным сервером (повезло — там была мелочь) и буквально через полчаса мы включили все обратно по основной схеме.

Все хорошо. Но. Я понял, что на сервере до сих пор крутится наколенная система бэкапов, которую я запустил полтора года назад. Да, я не сисадмин и вообще это не мой фронт работ, но если не я то, кто — и дальше следуют стандартные оправдания и дисклэймеры.

Из всего, что необходимо для работы мудла самую большую ценность представляет его база данных. Все прочее развертывается и ставится по отработанной схеме. А вот в MySQL хранятся все результаты, опросы и так далее. Читать далее…


make power

2013-10-30

Пока я работал с Неназываемым — столкнулся с необходимостью многократно прогонять комплект действий с питоновскими скриптами. Потратив примерно полчаса (чуть меньше на самом деле — учитывайте, что я не профессиональный программист, а скромный power user) разобрался в GNU make и написал себе такой вот файлик:

all: struc func

clean:
    rm *.csv
    rm *.dot
    rm *.png

struc:
    python st.py 
    find . -name '*.dot' -exec dot {} -Tpng -o {}.png \;
func:
    python fun.py 
    find . -name '*.dot' -exec dot {} -Tpng -o {}.png \;
one:
    python st.py 
    dot struct_kond_B1_01.dot -Tpng -o poligon.png
    geeqie poligon.png

В данном случае make struc считает одни аспекты Неназываемого и с помощью graphviz (точнее dot) рисует к ним диаграммы, make func делает тоже самое для других аспектов Неназываемого, make one — отладочный «единичный сценарий», make clean чистит папку от лишних файлов (храните в версионном контроле только то, что редактируется руками, ага). make или make all прогоняет сценарии всех аспектов Неназываемого.

Удобно. Когда освоил — понял, что именно make мне не хватало для автоматической обработки данных. Вообще говоря make предназначен совсем-совсем для другого, но с коммандлайновыми утилитами он прекрасно автоматизирует действия и в тоже время делает это очень прозрачно, избавляя от необходимости плодить где-то по окрестностям скрипты и алиасы.

Например. Читать далее…


weatherman или сбор статистики о погоде через METAR

2013-03-26

Давно мечтал про скрипт, накапливающий статистику по изменению температуры и давления. Год назад, написал крошечный парсер на питоне, выгребающий из интернета metar-файл для моего города и парсящий из него давление и температуру.

Работает он так:

vik@firefly:~/blog$ python ~/bin/metar.py
на 22:00
-02 °C 1010 гПа

В конки встроен с помощью строки:

${offset 140}За бортом:${color green} ${execi 600 python /home/vik/bin/metar.py | tail -n 1 }${color }

Краткие пояснения по тому, как я пришел к идее (фактически склепал на коленке — питон хорош в том числе тем, что позволяет «думать руками»), я вынес в приложение.

Дальше дело застопорилось. То ли мне не хватило вренмени, то ли что-то еще. Скорее всего, я хотел реализовать весь процесс одним скриптом и в итоге не нашел для этого времени.

Пару дней назад, разбирая conky-систему, нашел этот скрипт и кое-что в нем поправил.

Сегодня меня (после очередного скачка атмосферного давления, на которое мое серое вещество не очень хорошо реагирует) осенило — раз скрипт выдает данные (и справляется неплохо, не смотря на примитивность) — почему бы не перенаправить их в файл и завязать все это на крон? Получится именно такой сборщик статистики, которого мне хотелось. А сам файл, можно будет потом скормить gnuplot’у, ну или libreoffic’у в худшем случае.

Сказано-сделано.

описание процесса


Пришла весна — готовь коньки

2013-03-24

Вчера из-за непогоды сидел в основном дома — поэтому нашел время заняться уютненьким дебианом. Для начала разобрался-таки в чем была проблема с пульсаудио — оказалось (внезапно!) в драйверах к видеокарте, которые перехватывали на себя контроль. Вдохновился советом сэра Шамана и переставил дрова на свободные nouveau — все заработало как часы, к тому же включился фреймбуфер, которого мне недоставало.

Ну и по инерции таки собрался поменять конфиг conky. Сейчас у меня рабочий стол без всяких рисунков — только navy blue фон.

а коньки в правом углу выглядят так


Гугл, который всегда с тобой

2012-09-14


«Мозг, хорошо устроенный, стоит больше, чем мозг, хорошо наполненный»

(с) Мишель де Монтень

Статья о том, почему в Линуксе не нужны словари была для меня одной из самых полезных. Заинтересовавшись, скомплектовал небольшую подборку из текстовых справочников. Через некоторое время выяснилось, что набрать что-то типа grep 'ШУШПАН' dal.txt намного быстрее, чем лезть за результатами в интернет (да и попробуй найди все что можно получить по набору, такого, например, «заклинания» grep ' [^ ]*опа ' dal.txt -o | sort | uniq). Еще интереснее оказалось для меня то, что информации которая есть в (списком): энциклопедическом словаре, словаре Даля, толковых словарях Ушакова и Ожегова, Библии, англо-русском словаре Мюллера, орфографическом словаре и еще нескольких справочниках, хватает с головой — во всяком случае для начального поиска. При этом за счет того, что поиск идет по «чистой информации», за счет того, что искать можно в консоли без необходимости запускать браузер — все летает. При этом все работает даже в отсутствие интернета.
Читать далее…


Малая Карта для АБТФ — теперь и в bash

2011-05-27

Малая Карта. Позволяет открывать в боковом меню «карту»-содержание большого текстового файла (заголовками считаются все строки, которые начинаются с #). Карта открывается по ,mm. По <Enter> на любом из заголовков, файл в главном окне прокручивается на нужный заголовок. По <Esc> меню с картой закрывается.

Использую этот скрипт примерно полгода уже год — и не могу нарадоваться. Он очень упрощает работу с АБТФ и используется намного шире, чем я предполагал в самом начале. Практически любой текст, который размечен через # можно открыть в виде содержания и быстро найти нужный раздел.

Если поставить себе расширение Vim Outliner, то содержание будет выводиться компактнее — в виде аутлайна, который «схлопывает» разделы.
Читать далее…


Допиливание Crunch Bang на лету

2010-12-09

Большую часть времени на работе я сейчас трачу в компьютерных классах. Работать под windows теоретически возможно (все нужные мне инструменты — кроссплатформенные), но практически невыносимо — из-за засилья вирусов. LiveCD дистрибутив Linux’а оказался в этой ситуации гораздо практиченее.

Поэкспериментировав с флэшками и дисками пришел к выводу о том, что в моей ситуации лучше всего подходит CD-вариант системы. PuppyRus linux был одним из вариантов и очень хорошим вариантом, но не прошел. Главным образом по причине совершенно идиотского набора софта. То есть вместо нужных мне vim, firefox, pcmanfm’а там нечто странное типа opera, geany и rox. И поставить что-то еще очень сложно, поскольку в новой версии они куда-то намертво запрятали slapt-get.

Короче, наилучшим выбором оказался CrunchBang — быстрый, легкий с оптимальным набором софта по умолчанию — даже удивитильно насколько четко он вписался в мой стиль работы.

Оказалось очень полезным иметь под рукой скрипт, который выставляет все, что нужно. На самом деле это не только скрипт, но и отдельная папка на флэшке:

vik@firefly:/media/W7/big_sync$ ls -a

.fonts  .gvimrc  openbox  .reminders  .screenrc 
sync.sh  truecrypt-6.3a-setup-x86  .vim  vimrc  .vimrc

Как видно из листинга, в ней лежат исходники, которые копируются в домашнюю папку кранча и бинарный true-crypt-инсталлятор, который опционально запускается отдельно.

sync.sh — это скрипт, который после запуска приводит кранч к нужному для меня виду:

#! /bin/bash
# Копируем дот-файлы настроек 
# в домашнюю папку 
# (vimrc, .fonts и все такое прочее)
cp .[0-z]* ~ -R -v

# выставляем русско-английскую клавиатуру 
# с переключением по Alt+Shift
setxkbmap us,ru -option grp_led:caps,grp:alt_shift_toggle

# подставляем правильную временную зону 
# Киев UTC+2
sudo cp /usr/share/zoneinfo/Europe/Kiev /etc/localtime

palm, linux makeztxt и iconv

2010-07-24

Я уже писал про то, что АБТФ имеет то преимущество, что достаточно просто закидывается в палм. У меня это происходит следующим образом. Для начала я копирую файл в папку ~/tmp и конвертирую его в виндовую кодировку с помощью iconv:


cp ~/blog/main.txt ~/tmp/main.txt
iconv -t=cp1251 -c main.txt > main_cp.txt

Ключ -t=cp1251 указывает куда конвертировать (в данном случае из utf-8, в которой я веду заметки в cp1251, которую понимает палм), ключ -c нужен, чтобы подавлять вывод заведомо непечатаемых символов, которые есть в utf-8, но которых нет в cp1251 (например, знак йены).

Дальше остается преобразовать main_cp.txt в .pdb файл. Это можно сделать простой командой:

makeztxt -o main.pdb main_cp.txt

Ключ -t добавляет в файл заголовок под которым файл будет виден в базе палма.

makeztxt -t blog_main -o main.pdb main_cp.txt

Мне удобно, чтобы файл имел оглавление — сразу автоматически расставленные заголовки по всем ключевым разделам блога (90000 строк очень долго листаются в поисках нужного раздела). Поэтому я добавляю ключ -r, который расставляет закладки по всем заголовкам разделов. Разделы находятся через регулярное выражение ^#.{,15} — начало строки, за которым следует решетка #, за которой следует пятнадцать или меньше любых символов. Ключ -l (list) выводит на печать список сгенерированных закладок, чтобы можно было контролировать процесс.

makeztxt -r "^#.{,15}" -l -t .main2010 -o main.pdb main_cp.txt

Теперь можно скопировать main.pdb в память палма и наслаждаться :)

У меня все эти операции проделываются через скрипт ~/bin/bmz, который выглядит примерно так:

#! /bin/bash

cd ~/tmp
cp ~/blog/main.txt .
iconv -t=cp1251 -c main.txt > main_cp.txt
makeztxt -r "^#.{,15}" -r "^@ 20..-..-.. @ ..:.." -l -t .main2010 -o main.pdb main_cp.txt 
cp ~/blog/cites.txt .
iconv -t=cp1251 -c cites.txt > cites_cp.txt
makeztxt -r "^#.{,15}" -r "^@ 20..-..-.. @ ..:.." -l -t .cites2010 -o cites.pdb cites_cp.txt 
rm ~/tmp/main.txt
rm ~/tmp/main_cp.txt
rm ~/tmp/cites.txt
rm ~/tmp/cites_cp.txt

Достаточно набрать bmz в командной строке, а потом скопировать получившиеся .pbd-файлы в палм. Поскольку у меня сейчас Palm Sony с внешней карточкой, я просто вставляю ее в кардридер и копирую файлы напрямую.


Пакетная работа с файлами в командной строке. Перекодирование mp3-файлов для изменения битрейта.

2010-06-09

Мой yepp-плейер при всем его удобстве (особенно радует его неубиваемость и то, что он работает от батарейки, которую несложно достать в поле) отличается небольшой емкостью — всего 128М. Посему, музыку для него я обычно ужимаю до битрейта в 128 — лучшее качество я все равно не смогу оценить в наушниках, а место можно сэкономить.

Некоторое время я это перекодирование выполнял через пакетную обработку в Audacity, однако перед экзаменом по философии внезапно выяснилось, что Audacity на текущую ось я почему-то не поставил. Зато у меня был lame — который можно использовать для этих целей с соответствующими ключами, например так:

Читать далее…


Каталогизация дискохранилища

2010-03-27

Идея каталогера, который бы сохранял на диске содержимое моей библиотеки (медиатеки? информатеки? дискохранилища?) dvd не отпускала меня с тех самых пор, как я перебрался на убунту. Конечно, Cathy прекрасно работала под wine-ом, и вполне справлялась с теми задачами, которые на нее были возложены еще в старой системе. Некоторое время у меня крутилась в голове идея обобщенного скрипта на Питоне, однако в конце-концов на Хабре появился пост, который расставил все по своим местам. Главной оказалась идея о том, что файловую структуру диска без особых хлопот можно получить через find.

Читать далее…


%d такие блоггеры, как: