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

4 сентября 2010 г.

Передача данных посредством FloppyNet. Нарезка и склейка файлов.

Сегодня потребовалось передать относительно большой файл посредством ФлоппиНет (FloppyNet). Для тех, кто не в теме, поясняю: ФлоппиНет - это передача данных посредством 3.5 дюймовых дискет. Этот способ передачи данных уже давно устарел, сейчас в качестве среды передачи широко используются медные провода, и всё чаще физической средой передачи служит свет, идущий по оптоволокну.

ФлоппиНет является одной из первых технологий семейства КроссоНет (sneakernet), не считая тех, что были в до-компьютерное время. Принцип технологий передачи данных, входящих в семейство КроссоНет, заключается в том, что данные записываются на переносной накопитель, который необходимо отнести к получателю. Если вам часто приходится передавать данные подобным образом, вам желательно иметь хорошие кроссовки для быстрой доставки данных с наименьшим количеством потерянных пакетов. Отсюда и название данной технологии.
Так как переносные накопители могут вместить всё больший объём данных, данная технология продолжает применяться повсеместно, даже развиваться, и вряд ли устареет в ближайшем будущем. Впрочем, на замену КроссоНет приходят файлообменные сети, которые выполняют ту же функцию, только быстрее и надёжнее. Единственное условие - наличие у отправителя и получателя подключения к сети Интернет.

Итак, я решил использовать совершенно устаревшую технологию ФлоппиНет, поскольку это был самый простой и наименее затратный способ из доступных. Данная технология обладает единственным преимуществом - её поддерживают даже самые старые компьютеры и пользователи. К недостаткам можно отнести высокую вероятность потери пакетов данных во время передачи и низкую скорость.

У меня есть старый ноутбук IBM ThinkPad 760ED, который поддерживает ФлоппиНет, и относительно новый персональный компьютер (ПК) под управлением Linux, который так же поддерживает эту технологию. На ПК есть файл, который нужно передать на ноутбук, но который невозможно передать одним пакетом через ФлоппиНет. Следовательно, его нужно аккуратно нарезать на маленькие кусочки, которые потом можно будет последовательно передать. В Linux с нарезанием файлов проблем нет - есть инструмент, острый, как скальпель и надёжный, как... Как все базовые утилиты Linux, проверенные десятилетиями использования. Имя ему - split. Как и с любым качественно изготовленным инструментом, работать с ним не составляет труда.

Допустим, файл называется bigfile.tgz и он "весит" 2 мегабайта. Нарежем его на кусочки размером в 800 килобайт:

# split -b800k bigfile.tgz

Сразу после флага -b указывается максимальный размер каждого кусочка, в данном случае это 800 килобайт. О том, что задан размер в килобайтах, говорит буква k сразу после числа, как не трудно догадаться. Мегабайты обозначаются буковой m, а если буква не указана, то подразумеваются байты.

После нажатия клавиши Enter мы обнаружим в текущей директории несколько файлов под названиями xaa, xab, xac и т.д. Можно задать названия для частей файла - для этого нужно передать команде ещё один параметр после имени нарезаемого файла - префикс. Пусть, мы хотим, чтобы получившиеся части именовались как part_a, part_b part_c и т.д. Тогда префикс будет part_, и команда будет выглядеть вот так:

# split -b800k bigfile.tgz part_

Теперь копируем последовательно кусочки на дискету (или несколько дискет), и переносим на ноутбук. Там все кусочки большого файла сваливаем в одну кучу один каталог.

В Linux файлы "склеиваются" не сложнее, чем нарезаются. Для склеивания частей воедино используется команда cat:

# cat part_a part_b part_c ... part_NN > bigfile.tgz

Но вот ведь незадача! На ноутбуке нет (ещё нет) установленного Linux, только DOS и синие панельки Norton Commander... Тем не менее, повода для паники нет - DOS умеет склеивать части файла, правда, делает это несколько странно (на взгляд пользователя Linux, по крайней мере).

В DOS есть команда COPY, и пусть вас не вводит в заблуждение её название - она предназначена не только для копирования файлов, но и для склеивания файла из частей. Синтаксис команды не сложен, если вам интересны подробности, смотрите help copy в DOS. Я же затрону только то, что необходимо для склеивания бинарных (двоичных) файлов. В общем виде, это выглядит так:

# COPY /b part_a + part_b + part_c + ... + part_NN bigfile.tgz

Флаг /b указывает на то, что конечный файл является бинарным. Обратите внимание, что части файла как бы суммируются знаками "+". Если пропустить хотя бы один плюс между частями файла, команда выполнится некорректно.

В моём случае, команда выглядела примерно так:

# COPY /b part_a + part_b + part_c + ... + part_NN bigfile.tgz

- и из разрозненных частей, переданных через ФлоппиНет, вновь образовался исходный файл. Красота...

3 мая 2010 г.

Немного о практическом использовании alias'ов

В замечательной книге Алексея Федорчука "Доступный UNIX", которая мне очень помогла на стадии базового освоения Linux и продолжает помогать до сих пор, есть отдельный параграф, посвящённый назначению псевдонимов для команд. Вряд ли я смогу сказать об этой возможности что-то новое. С помощью команды alias можно назначить псевдоним или переопределение для любой команды с любыми параметрами. Команда alias имеет следующий синтаксис:

# alias [имя_псевдонима[=значение_псевдонима] ...]

Будучи данная без аргументов, выведет список всех определённых пользователем псевдонимов. Например,

# alias
alias grep='grep --colour=auto'
alias ls='ls --color=auto'

Если, в качестве аргумента, дать название псевдонима/переопределения, то команда выведет его значение:

# alias grep
alias grep='grep --colour=auto'

Чтобы удалить псевдоним/переопределение, достаточно дать команду

# unalias grep

"Алиасы", будучи прописанными в конфигурационных файлах оболочки (shell), сохраняются и после перезагрузки, в противном случае - будут действовать только в пределах текущей сессии. Например, глобальные alias'ы оболочки bash хранятся в /etc/bash/bashrc. Кроме этого, для каждого пользователя существует отдельный конфигурационный файл для командной оболочки, хранящийся в домашней директории и считывающийся после глобального конфигурационного файла.

Для примера, создадим переопределение для команды удаления rm

# alias rm='rm -i'

Это может спасти пользователя от случайного удаления нужных файлов. Как это работает? Всё очень просто. Командой выше мы создали переопределение для команды удаления rm с флагом -i. Имя псевдонима совпадает с именем оригинальной команды, но псевдоним обладает как бы более высоким "приоритетом" выполнения, и, если мы сейчас дадим команду

# rm file1.txt

она будет равносильна

# rm -i file1.txt

Флаг -i или --interactive, как понятно из его имени, запускает команду в интерактивном режиме. Команда, запущенная с данным флагом, запросит подтверждение у пользователя - действительно ли он хочет удалить файл file1.txt? Этот флаг применим ко многим комадам/утилитам, выполнение которых может привести к нежелательным/неприятным последствиям, таким, как упомянутое выше случайное удаление важных файлов.
Теперь сохраним созданный alias в конфигурационном файле пользователя:

# echo alias rm='rm -i' >> ~/.bashrc

Всё, теперь переопределение команды rm сохранится и после перезагрузки.

Псевдонимы работают похожим образом, но их имена не совпадают с именами доступных команд/утилит. Например,

# alias ll='ls -l'

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

Я сейчас мало использую alias'ы, так как они не способствуют запоминанию важных флагов команд. Более того, к ним привыкаешь, и в системе, где привычные alias'ы не определены, можно запросто ввести что-то вроде rm -r ~/*, после чего все файлы в домашней директории будут удалены без предупреждения. Конечно, этот глупый пример, зато наглядный. На мой взгляд, alias'ы не отменяют требование внимательности со стороны пользователя при выполнении команд, особенно, если он работает от имени суперпользователя (root'a).

А вот свежий пример использования команды alias.
Несколько дней назад установил консольный тренажёр "слепого" набора на клавиатуре gtypist:

# emerge -av gtypist

При попытке запустить тренажёр, получаю сообщение:

# gtypist
(null): i18n problem: invalid value for msgid "Y/N": Д/Н

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

# LANG="en" gtypist

А ещё лучше, чтобы каждый раз не указывать локаль, создать переопределение:

# alias gtypist='LANG="en" gtypist'
# echo alias gtypist='LANG="en" gtypist' >> ~/.bashrc
# gtypist
Happy Typing!


Теперь приложение работает без проблем.

31 октября 2009 г.

Возможности команды mkdir

По мере изучения Ubuntu открываю для себя замечательные возможности командной строки (терминала). Одна из них - возможность решать простые задачи так же просто, как они этого требуют.
Мне недавно нужно было создать несколько каталогов в одном - казалось бы, простая задача. Если каталогов один или два, мы можем сделать это простым кликом правой кнопки мыши и выбором пункта контекстного меню "Создать папку". Или нажать Ctrl+Shift+N (эта комбинация клавиш создаёт новый каталог в текущем). Просто, не правда ли? Но если нам нужно создать много каталогов, да ещё и в каждом каталоге ещё подкаталоги? Создать папку, и ещё папку, и ещё, клик, клик, клик... А ведь каждой папке ещё и название нужно дать! Причём, такая задача не является редкостью и может возникнуть просто в процессе работы пользователя. Кажется, задача простая, но решение её может оказаться чрезмерно сложным и долгим. И тут как раз очень помогает знание простейших команд терминала.
Команда mkdir (от англ. make directory) предназначена для создания каталогов. Сначала я недооценивал возможности этой команды, но моё мнение на её счёт изменилось, когда нужно было решить задачу наподобие той, что описана выше. Рассмотрим самый простой вариант использования этой команды. Предположим, нам нужно создать в /home/username/Музыка структуру каталогов для музыкальной коллекции (фонотеки), где username - ваше имя пользователя. Если вы, как и я, любите порядок, то структура каталога "Музыка" примет у вас примерно следующий вид

~/Музыка/A/(все исполнители на А)
         B/(все исполнители на B)
         C/
         D/
         ...

Для экспериментов я всё же рекомендую создать для начала новый пустой каталог, а потом, когда уже будет понятен принцип работы команды, можно начать применять её на практике. Открываем терминал и пишем:

mkdir ~/mkdirexp

Теперь выбираем нужный нам каталог - для этого предназначена команда cd (от англ. change dir) :

cd ~/mkdirexp/

Теперь создаём все каталоги командой:

mkdir A B C D E F G I J K L M N O P Q R S T U V W X Y Z

Просто, верно? Но что делать, если у нас до этого музыка была свалена в один каталог, и в одной куче были разные исполнители и альбомы? Определим задачу: нужно создать структуру каталогов и необходимые подкаталоги (перенесение музыки во вновь созданные каталоги я не буду сейчас рассматривать - хотя и здесь несомненно есть широкие возможности для упрощения и автоматизации) :

~/mkdirexp/A/A_исполнитель_1/2007 - Альбом 1/
             A_исполнитель_1/2008 - Альбом 2/
             A_исполнитель_2/
           B/B_исполнитель_1/
           C/
           D/
           ...

С помощью команды mkdir делается это так же просто, как и в предыдущем примере.
Если вы выполняли команду из предыдущего примера, то в каталоге mkdirexp у вас уже должны быть подкаталоги. Для наглядности следующего примера попрошу удалить их - зайдите в каталог mkdirexp, выделите все подкаталоги (Ctrl+A) и удалите их (Shift+Del - для удаления файлов без помещения в корзину).
Я не буду в данном примере создавать все каталоги - нам главное понять принцип работы, или, если хотите, синтаксис команды:

mkdir -p A/{A_исполнитель_1/{"2007 - Альбом 1","2008 - Альбом 2"},A_исполнитель_2} B/B_исполнитель_1

Посмотрим на команду: параметр -p (от англ. parents), передаваемый команде, означает, что нужно создать все "родительские" каталоги для подкаталогов, если они отсутствуют. Если мы упустим этот параметр, то получим сообщение об ошибке и часть каталогов не будет создана. В фигурных скобках через запятую перечислены подкаталоги, которые требуется создать. Причём, как видно из примера, можно создавать подкаталоги в подкаталогах и т. д. Названия папок наподобие "2007 - Альбом 1" заключены в кавычки, т. к. в именах есть пробелы - то есть, мы говорим команде, что это одно имя, а не несколько, разделённых пробелами.

Подробную справку о всех параметрах команды mkdir и других командах терминала можно узнать, набрав в терминале man mkdir или man имя_команды.