Показаны сообщения с ярлыком консоль. Показать все сообщения
Показаны сообщения с ярлыком консоль. Показать все сообщения

2010-12-23

Переименование файлов по времени их создания

Дано: много файлов видео с телефона, формат 3gp, видеозаписи дочери с рождения. Замысел - сделать видеоальбом.
Нужно: переименовать их в соответствии со временем их создания, например "2010-12-23-10-26.3gp", чтобы порядок сортировки был в порядке создания.
Используем стандартные возможности консоли. Запускаем цикл по файлам формата 3gp, и производим действия перемещения с найденным файлом, предварительно состряпав ему новое имя из времени его создания.
for i in *.3gp; do mv "$i" "`ls -l $i | awk '{ print $6 "-" $7 }' | awk -F':' '{ print $1 "-" $2 }'`.3gp"; done

2010-04-20

Функции в bash. Архивируй это!

Несмотря на два с половиной года использования Linux (вплотную с Ubuntu 7.10), как-то не вникал в тонкости shell-программирования. Ну цикл организовать, условия, выборки - пригождалось, но не белее того. Написал себе пару десятков alias-ов, для удобства, но чтобы обрабатывать опции командной строки писал отдельные скрипты на bash или python и складывал их в ~/bin, добавив путь к этой папке к переменной PATH.
Сравнительно недавно попалась на глаза информация о функциях в bash, и оказалось - это то, что мне нужно, чтобы не плодить скрипты. Они, оказывается, способны обрабатывать опции. В связи с этим, чтобы удобнее было создавать zip-архивы из чего угодно и поменьше тыкать по клавишам, накидал вот такую функцию, и поместил ее в ~/.bashrc

function zipp(){
    if [ -d "$1" ]; then out=`basename "$1"`".zip"; fi
    if [ -f "$1" ]; then out=`echo $1 | sed 's/\(.*\)\..*$/\1/g'`".zip"; fi
    zip -r -9 "$PWD/$out" "$1"
}

В ней проверяется, что сжимаем, каталог или файл, если файл - то отсекается расширение, если каталог - берется его имя без полного пути. После этого к имени добавляется ".zip", и передается архиватору как имя файла создаваемого архива.
Опции -r и -9 означают архивирование со всеми вложенными файлами с максимальной степенью сжатия.
Теперь, вместо того, чтобы писать в консоли
$ zip -9 -r myfolder.zip myfolder/

я пишу
$ zipp myfolder

Неправда ли, намного удобнее?

2010-04-19

Создаем DEB-пакет

Сегодня мы будем учиться готовить стандартные Debian-ские пакеты.
Оказывается, это не так сложно, и к тому же интересно.

Немного информации о пакете

Если вкратце, то deb-пакет - это ar-архив, распаковать который можно так:
$ ar x mydebpackage.deb

В результате мы увидим извлеченные файлы:
data.tar.gz (tar-архив с файловой структурой, копируемой в систему при установке)
debian-bynary (файл с номером версии формата пакетов)
control.tar.gz (tar-архив управляющей информации о пакете)

В файле control.tar.gz содержатся интересные вещи:
- postinst (скрипт, выполняемый после установки)
- postrm (скрипт, выполняемый после удаления)
- md5sums (контрольные суммы файлов)
- control (остальная метаинформация)

Например, в control может быть примерно такое содержимое:

Package: mypackage (название пакета)
Version: 0.1 (версия)
Depends: liba, libb1, libc2 (зависимости)
Recommends: libpamparam, lalala (рекомендовано)
Suggests: libbestdeb (могут улучшить работу пакета)
Section: utils
Priority: optional
Description: My best package! But for what?...



Создаем свой DEB

Чтобы создать deb-пакет, у нас есть все, что нужно. К примеру, я хочу собрать пакет видео-утилит, назовем его videotools.
В него войдут bash-скрипты для извлечения из видеофайлов отдельно аудио-дорожки, видео-дорожки, конвертирования avi в flv и обратно.

Для начала, создаем структуру каталогов.

videotools (каталог, в котором все остальное)
- DEBIAN/control (каталог DEBIAN с файлом control)
- usr/local/bin/getaudio (этот и остальные - мои скрипты)
- usr/local/bin/getvideo
- usr/local/bin/flv2avi
- usr/local/bin/avi2flv

Содержимое файла control будет примерно таким:

Package: videotools
Version: 0.1
Maintainer: Kawaikunee <secret@mail>
Description: Contaned scripts getaudio, getvideo, flv2avi, avi2flv
Section: utils
Priority: optional
Architecture: all
Depends: bash, mplayer, mencoder

Архитектуру указываю любую, это же просто bash-скрипты.

Теперь собираем пакет:
$ dpkg-deb --build videotools
И получаем файл videotools.deb

Трубим в фанфары и кушаем мороженое в честь успеха.

Дополнительная информация

Виртуальный пакет - это общее имя, употребляемое к любому из пакетов некой группы, все пакеты из которой обеспечивают подобную базовую функциональность (например, программы для работы с электронной почтой).
Чтобы добавить файл в виртуальный пакет какой-либо функциональности, нужно указать это в файле control, например так:
Provides: mail-transport-agent
Чтобы сделать файл зависимым от чего-то общего, так:
Depends: mail-transport-agent

Метапакет - пакет, в котором нет реальных файлов, он содержит только зависимости, чтобы гарантированно установить их. Например - ubuntu-standard

Создание DEB-пакета из исходников

Никакой магии. Устанавливаем пакет checkinstall (я уверен, не нужно вас учить, как это делается ^_^). Как обычно, в папке с распакованными исходниками делаем
$ ./configure && make
а вместо
$ sudo make install
набираем
$ sudo checkinstall
Такой финт ушами сначала создаст deb-пакет, а потом установит его через apt, что в дальнейшем обеспечит его корректное удаление, даже если разработчик не предусмотрел такой возможности. К тому-же, у нас останется пакет, который мы можем переслать друзьям, менее сведующим в этих консольных тонкостях, или которым это вовсе ни к чему.

Создание DEB-пакета для программ на Python

Для этого используем пакет py2deb(http://www.manatlan.com/page/py2deb). Приведены очень доступные примеры, а сам пакет скачивается там же, на сайте разработчика.
Например, вот скрипт, которым я упаковываю программу для изучения Библии. Оцените простоту!

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from glob import glob
from py2deb import Py2deb

p=Py2deb("bible")

p.author="Kawaikunee"
p.mail="secret@mail"
p.description="Программа в помощь изучающим Библию. Просмотр, поиск, параллельные места. Выделить текст и нажать клавишу F: поиск по выделенному. Клик на номере стиха: показать параллельные места. Клик на названии отрывка в найденном: открыть эту главу."
p.url = "http://kawaikunee.blogspot.com"
p.depends="python-gtk2, python, python-pysqlite2, msttcorefonts"
p.license="gpl"
p.section="utils"
p.arch="all"

p["/usr/bin"] = ["bible.py|bible","bible_iface.py","bible_shift.py"]
p["/usr/share/Bible/src"] = ["ot.png","nt.png","ap.png","ava.svg","bible_shift.xml"]
p["/usr/share/Bible/modules"] = ["modules/rst.sqlite|rst.sqlite","modules/kjv.sqlite|kjv.sqlite","modules/bible.db|bible.db"]
p["/usr/share/Bible"] = glob("modules/para/*")
p["/usr/share/applications"]=["Bible.desktop|Bible.desktop"]

p.generate("0.3.1")

Воодушевил? Дерзайте!

2010-02-18

Скрипт-напоминалка

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

#!/bin/bash
# Для вывода на экран в графическом режиме необходимо экспортировать переменную
export DISPLAY=:0.0
# Сообщим себе, что скрипт запущен
sleep 10 && notify-send "Таймер включен"
# Запустим в цикле сообщение о перерыве, ожидая вывода следующего 1 час
while :; do sleep 3600 && notify-send "Перерыв 15 минут"; done

Теперь сохраним скрипт, дадим ему права на выполнение и пропишем в автозагрузку.

P.S.
Для вывода сообщений посредством notify-send не забудьте установить libnotify-bin:
$ sudo apt-get install libnotify-bin

2009-09-02

Если FFmpeg при кодировании ругается на нехватку кодеков

На днях решил перекодировать пару видяшек для PSP жены, воспользовавшись ffmpeg, на что последний отреагировал, разведя руками - не знаю, мол, кодека mpeg4.
Стало ясно, что в системе установлен не полный набор кодеков. Чтобы решить эту проблему, делаем так:

Удаляем полностью ffmpeg и обновляем данные репозитариев:
$ sudo apt-get purge ffmpeg
$ sudo apt-get update

Устанавливаем полные библиотеки кодеков, они попросят удалить предыдущие. ОК.
$ sudo apt-get install libavcodec-unstripped-* libavdevice-unstripped-* libavformat-unstripped-* libavutil-unstripped-* libpostproc-unstripped-* libswscale-unstripped-*

Возвращаем ffmpeg:
$ sudo apt-get install ffmpeg

А вот скрипт, чтобы кодировать avi-шки в формат, который переваривает PSP:

#!/bin/bash
[ -d psp ] || mkdir psp
ffmpeg -i "$1" -f psp -s 368x208 -aspect 16:9 -vcodec mpeg4 -b 500k -acodec libfaac -ab 96k -ac 2 "psp/$1.MP4"

В интернетах встречается подобный скрипт, в котором написано "-acodec aac" - не верьте, будет ругаться.

2009-07-09

Новое знакомство со старым другом: gnome-terminal

Как всегда, то что под рукой - то хуже всего знаешь. А узнаешь только когда приспичит.
Кому не известна стандартная гномовская консоль gnome-terminal? Разве что заядлому GUI-шнику. Этот инструмент служит верой и правдой уже многие годы, стал привычным и... хорошо знакомым?
А началось все с того, что я решил освоить легендарный VIM. И очень мне хотелось сделать для него ярлычок в панели запуска приложений, чтобы не лезть в меню. Чтобы одним кликом запустилась консоль и в ней сразу же vim.

Путь первый.
В окне терминала идем в меню "Правка - Настройки профиля - Заголовок и команда - Запускать другую команду вместо моей оболочки". Ставим галочку, вписываем в строку для команды "vim". Теперь при запуске gnome-terminal вместо приглашения shell сразу же будет запущен vim. Что-ж, это уже неплохо.

Путь второй, усовершенствованный.
В меню "Правка - Профили" создаем новый профиль, назовем его, скажем, "vim", в котором пропишем запуск редактора (см. путь 1). Теперь, чтобы запустить терминал с этим профилем, нужно дать команду:
$ gnome-terminal --window-with-profile=vim
Здорово! А теперь, захотим открыть еще одну вкладку в этом терминале. Угадайте, что в этой вкладке автоматически запустится? Правильно, он, родимый. К пути 1 это тоже относится.

Путь третий, продолжаем расти.
Не будем плодить профили, если, конечно, вам не нужны особые расцветки в разных окнах консоли. На этот раз мы используем стандартный профиль, но запустим vim так:
$ gnome-terminal -e vim
Кидаем ярлычок на панель запуска приложений и радуемся. Теперь чуть-чуть его доработаем: нам ведь не нужна панель меню вверху? Да и хорошо бы его на весь экран сразу развернуть, и рабочую директорию задать, чтоб удобнее было.
$ gnome-terminal -e vim --hide-menubar --geometry=1280 --working-directory=/home
Неплохо, верно? Просто указать параметры запуска, и всего делов.

Путь четвертый: совершенство.
Наконец, мне захотелось, чтобы по одному клику открывалась консоль с двумя вкладками, в одной из которых будет vim, а во второй mc, чтобы удобнее было с файлами управляться. Вот, что у меня получилось:
$ gnome-terminal \
--tab-with-profile=Default \
--working-directory=/home/kawaikunee/Проекты/ \
--title=MC \
-e mc \
--tab-with-profile=Default \
--working-directory=/home/kawaikunee/Проекты/ \
--title=VIM \
-e vim \
--hide-menubar \
--geometry=1280
Что мне и требовалось. Остается нажать на F11 чтобы ничто не отвлекало от процесса созидания очередного шедевра. Дерзайте!
P.S. Помощь в понимании вопроса оказана man gnome-terminal

2009-07-06

Linux Mint: долой болтливых животных!

У кого установлен Linux Mint по умолчанию, тот при запуске терминала перед строкой приглашения видит некую заумную фразу на английском языке, которую якобы цитирует одино из нескольких видов животных: олень (или лось?), корова, пингвин, и вроде кто-то еще.
Поначалу прикольно, а потом достает. Как избавиться от этого?
sudo gedit /etc/bash.bashrc
Удаляем или комментируем последнюю строчку, примерно такую:
# /usr/bin/mint-fortune
Больше животные в консоли вас не потревожат.

2009-05-05

Чистка файлов на хостинге от сторонних включений с помощью связки grep+sed

Вот уже который раз на хостинге наблюдаю работу некоего зловреда, который включает в файлы сайтов, в названии которых есть слова "main", "index" и "default" сторонний код, подгружающий на компьютеры посетителей зараженные файлы с использованием iframe. Пользователей Linux это не касается, поэтому они могут спать спокойно, для них этот код означает просто очень долгую загрузку страницы, связанную с загрузкой в кэш зараженного файла. Зато пользователи Windows, особенно бороздящие просторы интернета с помощью (если это так можно назвать) IE, подвергаются атаке по полной программе. Я об этой заразе узнал от такого пользователя. Много файлов, много строк, поди найди там всё!
Приступим к решению!
1) Подключаемся к серверу по протоколу ssh и получаем командную строку.
2) Проверяем наличие бяк в файлах php и html, получив список файлов с внедренным кодом (одной строкой):
find . -name '*.php' -o -name '*.html' -exec grep -l -E '^<iframe src=.+></iframe>$' '{}' \;
3) Массово заменим эти включения на пустоту (одной строкой):
find . -name '*.php' -o -name '*.html' -print0 | xargs -0 sed -i -e 's/^<iframe src=.*><\/iframe>$//g'
Конечно, это все временное решение, но хотя бы до следующей атаки пользователи не будут страдать.
Если у кого-то на хостинге случилось подобное, расскажите как боролись!

2009-03-24

Полезности

В этой статье я буду собирать всякого рода полезности при работе в консоли, которые мне будут попадаться на глаза. Если захочется сказать "А, я знаю откуда ты это взял!" - не надо. Конечно же не сам придумал.

Вход более одного пользователя в систему с графическим интерфейсом
Для начала переходим в другую консоль, чем стандартная седьмая: Ctrl-Alt-F(1-6). Водим логин и пароль. Теперь мы вошли как второй пользователь в системе. Переходить в другие консоли можно c помощью сочетания клавиш Alt-F(1-7) Чтобы получить графическую оболочку, введем команду:
startx -- :1

Дефрагментация базы данных MySQL
В ходе изменений в структуре БД и информации в ней происходит фрагментирование данных. Дефрагментация выполняется командой:
mysqlcheck -o имя_базы_данных -u пользователь_бд -p пароль_бд
И вообще man mysqlcheck расскажет еще много интересного.

Поиск в мануалах
Иногда знаешь что надо найти, но не знаешь, где искать. Команда man позволяет воплотиться такой дикой мечте:
man -k ключевое_слово
Ну и стандартный метод поиска в открытом мануале - используем клавишу / и сразу за ней - искомое слово, Enter. Чтобы найти следующее вхождение этого-же слова, жмем клавишу n.

Узнать, какой процесс использует примонтированный носитель
lsof +D /media/имя_устройства

Закрыть все приложения, использующие примонтированный носитель
fuser -km /media/имя_устройства

Массовое конвертирование кодировки текста
Скорее всего, вам известно, как весело в Windows переводить текстовые файлы из одной кодировки в другую. Открыл в редакторе, сохранить как, повторять до изнеможения.
Linux открыл для меня прелесть утилиты enca. Поэтому
sudo apt-get enca
После этого текст в ненашей (не utf-8) кодировке приводится в норму так:
enconv *.txt

Массовая замена текста в файлах
Заменить один текст на другой в файлах указанного каталога (включая подкаталоги):
find . -name '*.txt' -print0 | xargs -0 sed -i -e 's/это_заменить/на_это/g'

Многое взято отсюда.

2009-01-23

Печать из консоли с опциями || Кому нужны эти GUI

Ну вот, я и добрался до своего блога после Рождественских праздников. Судя по всему, только я и читаю свой блог, ну да и ладно. Сегодня я напишу о том, как прекрасно можно и нужно использовать консольные команды для печати на принтерах, особенно из скриптов (bash или к примеру python).
В сети можно найти множество советов по этому вопросу, и как правило они сводятся к цитатам из man lpr. Да, конечно же мы будем использовать lpr. К сожалению, "man lpr" рассказывает только базовые опции, такие как имя принтера для печати, просмотр установленных принтеров и их статуса и т.п. Но есть там один любопытный намек:
lpr -o options
... и тишина! Если не попытаться искать ответ на вопрос, что же это за options, то lpr покажется довольно бедной по возможностям. Мне, к примеру, потребовалось отпечатать текст на поверхности CD, и мануал мне не помог в этом ни на процент. Так вот, дорогие мои, как-раз самое вкусное в man не положили. А в этом то вся сила lpr и проявляется. Можно отправлять на печать в любой лоток, указывать размеры, расположение и многое, многое другое!
Эх... требуют работать. Ладно, подробнее напишу позже. А пока вот для размышления, вчитывания и тестирования:

http://www.cups.org/documentation.php/doc-1.4/options.html

Уверен, вам понравится!

P.S. Вскоре открыл глаза и просматривая info lpr нашел, что документации полно и на локальном компьютере. Она прячется на 631 порту. Например, то-же, что и выше можно найти тут:
http://localhost:631/help/options.html?QUERY=options
А также многое другое.

P.P.S
О печати в сети, Драйвера для принтеров

2008-11-10

Найти и уничтожить

Порой простые вещи приносят радость. Вот сегодня, например. Приспичило мне удалить из коллекции музыкальных файлов те, которые без голосов, для караоке. Они обозначены: прямо в названии присутствует фраза "off vocal". А их много таких, папки в подпапках... Запал быстро испарился, уже на третьей директории.

Ладно, ладно, вы знаете что все можно сделать быстро и без лишних телодвижений, будь там хоть тысяча папок, сложенных матрешкой. Но ведь блог не только для вас, а еще и для меня, чтоб потом вспомнить. Так вот, делается все легко и непринужденно, помни, дорогой я:


find -name "*off vocal*.mp3" -exec rm {} \;