Содержание


Набор программ для командной строки littleutils

Comments

Пользователь, активно работающий в режиме командной строки в Linux и в прочих Unix-подобных системах, наверняка знаком с постулатом: "программа для командной оболочки должна выполнять только одну задачу и выполнять её хорошо". Этому постулату вполне соответствуют три десятка утилит, объединённых в пакет littleutils. Автор, Брайан Линдхолм (Brian Lindholm) занялся их написанием достаточно давно (по его собственным словам: около 2002 года), и на сегодняшний день представлена версия пакета 1.0.31.

В репозитории дистрибутивов пакет littleutils не попадает, поэтому после распаковки скачанного tarball-а следует воспользоваться тривиальной стандартной формулой ./configure && make && make install, правда, можно дополнительно дать команду make install-extra для установки пары-тройки утилит, расширяющих возможности основного комплекта.

1. Группа утилит, выводящих информацию о файлах

Утилита filedate по умолчанию выводит время модификации (изменения) заданных файлов, как показано в листинге 1.

Листинг 1. Стандартный вывод утилиты filedate
$ filedate *
books.txt	2011-09-18 22:16:25.000000000
make4	2013-10-11 21:38:52.000000000
pseudo_rnd	2011-10-17 19:50:55.000000000
README	2014-02-07 17:00:00.000000000
woof	2010-07-08 21:52:42.000000000

Формат отображаемой даты можно изменять с помощью ключей -l[ocal_format] и -t[ouch_format]. В последнем случае используется формат даты, применяемый в команде touch (см. листинг 2).

Листинг 2. Различные форматы вывода дат утилитой filedate
$ filedate -l *
books.txt	Sun Sep 18 22:16:25 2011
make4	Fri Oct 11 21:38:52 2013
pseudo_rnd	Mon Oct 17 19:50:55 2011
README	Fri Feb  7 17:00:00 2014
woof	Thu Jul  8 21:52:42 2010
$ filedate -t *
books.txt	201109182216.25
make4	201310112138.52
pseudo_rnd	201110171950.55
README	201402071700.00
woof	201007082152.42

Кроме того, можно вывести и время последнего обращения (доступа) к файлам с помощью ключа -a(ccess_time), что демонстрируется в листинге 3.

Листинг 3. Вывод времени последнего обращения к файлам
$ filedate -a *
books.txt	2014-03-18 23:27:11.000000000
make4	2014-04-11 15:57:19.000000000
pseudo_rnd	2014-03-20 16:33:35.000000000
README	2014-04-11 15:16:42.000000000
woof	2014-03-20 16:33:35.000000000
$ filedate -h
filedate 1.0.31
usage: filedate [-a(ccess_time)] [-f file_list] [-h(elp)] [-l(ocal_format)]
         [-p(ipe)] [-q(uiet)] [-t(ouch_format)] [-v(erbose)] file...

Последняя команда в листинге 3 позволяет получить краткую справку о ключах команды filedate. Из этой справки видно, что список файлов команда может получать не только из командной строки, но и из файла, имя которого задаётся после ключа -f, а также из конвейера (то есть, как вывод другой команды), если задать ключ -p.

Утилита filesize выводит размер файла в байтах (листинг 4).

Листинг 4. Вывод размеров файлов в байтах
$ filesize *
books.txt	2226
make4	558436
pseudo_rnd	5255
README	4381
woof	16810

Режим, задаваемый ключом -q(uiet), который, кстати говоря, имеется у всех утилит этой группы, исключает из вывода имена файлов, что может быть удобно при необходимости выполнения математических вычислений (листинг 5).

Листинг 5. Вывод только размеров файлов без имён и справка о ключах команды filesize
$ filesize -q *
2226
558436
5255
4381
16810
$ filesize -h
filesize 1.0.31
usage: filesize [-f file_list] [-h(elp)] [-p(ipe)] [-q(uiet)]
         [-v(erbose)] file...

Так же, как и флаг -q, флаги -f и -p имеют все команды из описываемой группы.

Утилита fileown показывает владельца и/или группу, а также соответствующие им идентификаторы для заданных файлов, как продемонстрировано в листинге 6.

Листинг 6. Информация о владельце файлов и его группе, выводимая командой fileown
$ fileown *
books.txt	alex
make4	root
pseudo_rnd	alex
README	alex
woof	alex
$ fileown -b *
books.txt	alex.users
make4	root.root
pseudo_rnd	alex.users
README	alex.users
woof	alex.users
[ ~/.../test ]$ fileown -bn *
books.txt	1000.100
make4	0.0
pseudo_rnd	1000.100
README	1000.100
woof	1000.100
[ ~/.../test ]$ fileown -h
fileown 1.0.31
usage: fileown [-b(oth_ids)] [-f file_list] [-g(roup_id)] [-h(elp)]
         [-n(umbers)] [-p(ipe)] [-q(uiet)] [-v(erbose)] file...

Утилита filemode выводит права доступа к заданным файлам, но только в числовом виде, как показано в листинге 7.

Листинг 7. Информация о правах доступа к файлам, выводимая командой filemode
$ filemode *
books.txt	0664
make4	0755
pseudo_rnd	0755
README	0644
woof	0755
$ filemode -h
filemode 1.0.31
usage: filemode [-f file_list] [-h(elp)] [-p(ipe)] [-q(uiet)]
         [-v(erbose)] file...

Утилита filenode позволяет увидеть inode-номер заданного файла (листинг 8).

Листинг 8. Inode-номера файлов, выводимые командой filenode
$ filenode *
books.txt	14174689
make4	1179694
pseudo_rnd	14174686
README	14174688
woof	14174685
$ filenode -h
filenode 1.0.31
usage: filenode [-f file_list] [-h(elp)] [-p(ipe)] [-q(uiet)]
         [-v(erbose)] file...

Утилита filehash выводит хэш-значения (MD5, SHA1, SHA224, SHA256, SHA384, SHA512) и при необходимости — размер файла (если задан ключ -s), как показано в листинге 9. По умолчанию выводится SHA256-хэш.

Листинг 9. Вывод хэш-значений и размеров файлов с помощью команды filehash
$ filehash -h
filehash 1.0.31
usage: filehash [ -1(MD5) ] [ -2(SHA1) ] [ -3(SHA224) ] [ -4(SHA256) ]
         [ -5(SHA384) ] [ -6(SHA512) ] [ -f file_list ] [ -h(elp) ]
         [ -n byte_count ] [ -p(ipe) ] [ -q(uiet) ] [ -s(ize) ] file...
$ filehash -s *
books.txt	2226	f1b26d161f806af4fec2231f40f4fd7670cdd7ca32aa113e8400d2155b7b9844
make4	558436	69b574ea089225b10f0f25e6bbbd59d57f027b1fe3a3f38aa5d114303994ccb7
pseudo_rnd	5255	46e596d258c368a9e07070001387abf616dbe8ef770c1b8584435d2dc99ea259
README	4381	7a69e122c21a5aa05957465f8a40759198362ea36aa029d1b674c5c3b87ae4f7
woof	16810	21086b67489381b477c9c0567b1d9f8b8f1deec12bd4e414969e3f155c1ff889
$ filehash -1s *
books.txt	2226	78b2de5e72103647d57a4651c2d518ec
make4	558436	d3912812416ea78652c6d7be3d77e296
pseudo_rnd	5255	06e281ce38a456a063c5a330446a77b9
README	4381	be878e6240d627213a95bce09e49efaf
woof	16810	4df770eedef7b011fc37d42015c801b9

Утилита lrealpath показывает действительный абсолютный полный путь к заданным файлам (см. листинг 10).

Листинг 10. Действительные абсолютные имена файлов с указанием полного пути к ним, выводимые командой lrealpath
$ lrealpath *
/home/alex/test/books.txt
/usr/local/bin/make
/home/alex/test/pseudo_rnd
/home/alex/test/README
/home/alex/test/woof
[ ~/.../test ]$ lrealpath -h
lrealpath 1.0.31
usage: lrealpath [-f file_list] [-h(elp)] [-p(ipe)] [-v(erbose)] file...

Из листинга 10 видно, что файл make4 в действительности является ссылкой на /usr/local/bin/make.

Утилита tempname создаёт временный файл с уникальным именем в каталоге /tmp (по умиолчанию; можно задать и любой другой каталоог). Это может оказаться полезным при написании скриптов. Примеры создания временных файлов показаны в листинге 11.

Листинг 11. Создание временных файлов с помощью утилиты tempname
$ tempname
tempname 1.0.31
usage: tempname [-c(reate_not)] [-d dirname] [-h(elp)] [-n(o_random_portion)]
         [-q(uiet)] [-s suffix] [-v(erbose)] [-w(ildcard)] [-D(irectory)]
         filename_prefix
note:  using the "-w" option implies the "-c" option and the "-n" option,
         the "-n" option also implies the "-c" option
$ tempname pseudo
/tmp/pseudo_vNh0PL
$ tempname pseudo -s alex
/tmp/pseudo_EW61U2alex

Утилита randomize выводит строки из одного или нескольких файлов в случайном порядке. Если файлы не заданы, то ожидается ввод со стандартного устройства ввода. Пример показан в листинге 12.

Листинг 12. Пример работы команды randomize
$ cat books.txt 
Иан Грэхем "Объектно-ориентированные методы. Принципы и практика"
Martin Abadi, Luca Cardelli - A Theory of Objects
Randal E. Bryant, David R. O'Hallaron. Computer Systems: A Programmer's Perspective.
Cousineau G., Mauny M. "The functional approach to programming"
Herlihy "The Art of Multiprocessor Programming"
Concurrent Programming in Erlang
Concepts, Techniques, and Models of Computer Programming (Peter Van Roy)

$ cat test.txt 
первая строка
вторая строка
третья строка
четвёртая строка
пятая строка

$ randomize -h
randomize 1.0.31
usage: randomize [-0/-z(ero_terminated)] [file...]
$ randomize books.txt test.txt 
вторая строка
Cousineau G., Mauny M. "The functional approach to programming"
первая строка
Randal E. Bryant, David R. O'Hallaron. Computer Systems: A Programmer's Perspective.
Concepts, Techniques, and Models of Computer Programming (Peter Van Roy)
Martin Abadi, Luca Cardelli - A Theory of Objects
Herlihy "The Art of Multiprocessor Programming"

третья строка
четвёртая строка
Иан Грэхем "Объектно-ориентированные методы. Принципы и практика"
пятая строка
Concurrent Programming in Erlang

$

2. Группа утилит, позволяющих изменять характеристики файлов и их содержимое

Утилиты lowercase и uppercase выполняют переименование файлов, заменяя прописные (заглавные) буквы на их строчные аналоги и наоборот, соответственно. Оба вида преобразований показаны в листинге 13.

Листинг 13. Переименование файлов (изменение регистра букв)
$ ls -l
итого 28
-rw-r--r-- 1 alex users     0 Апр 11 22:03 foUR.tEsT
-rw-r--r-- 1 alex users     0 Апр 11 22:03 One.test
-rw-r--r-- 1 alex users  4381 Фев  7 17:00 README
-rw-r--r-- 1 alex users     0 Апр 11 22:03 six.Test
-rw-r--r-- 1 alex users     0 Апр 11 22:03 TEN.test
-rw-r--r-- 1 alex users     0 Апр 11 22:03 tWo.test
-rwxr-xr-x 1 alex users 16810 Июл  8  2010 woof
$ uppercase -h
uppercase 1.0.31
usage: uppercase [-h(elp)] [-q(uiet)] [-v(erbose)] file...
$ uppercase *
foUR.tEsT moved to FOUR.TEST
One.test moved to ONE.TEST
six.Test moved to SIX.TEST
TEN.test moved to TEN.TEST
tWo.test moved to TWO.TEST
woof moved to WOOF
$ ls -l
итого 28
-rw-r--r-- 1 alex users     0 Апр 11 22:03 FOUR.TEST
-rw-r--r-- 1 alex users     0 Апр 11 22:03 ONE.TEST
-rw-r--r-- 1 alex users  4381 Фев  7 17:00 README
-rw-r--r-- 1 alex users     0 Апр 11 22:03 SIX.TEST
-rw-r--r-- 1 alex users     0 Апр 11 22:03 TEN.TEST
-rw-r--r-- 1 alex users     0 Апр 11 22:03 TWO.TEST
-rwxr-xr-x 1 alex users 16810 Июл  8  2010 WOOF
[ ~/.../test ]$ lowercase -h
lowercase 1.0.31
usage: lowercase [-h(elp)] [-q(uiet)] [-v(erbose)] file...
$ lowercase *
FOUR.TEST moved to four.test
ONE.TEST moved to one.test
README moved to readme
SIX.TEST moved to six.test
TEN.TEST moved to ten.test
TWO.TEST moved to two.test
WOOF moved to woof
$ ls -l
итого 28
-rw-r--r-- 1 alex users     0 Апр 11 22:03 four.test
-rw-r--r-- 1 alex users     0 Апр 11 22:03 one.test
-rw-r--r-- 1 alex users  4381 Фев  7 17:00 readme
-rw-r--r-- 1 alex users     0 Апр 11 22:03 six.test
-rw-r--r-- 1 alex users     0 Апр 11 22:03 ten.test
-rw-r--r-- 1 alex users     0 Апр 11 22:03 two.test
-rwxr-xr-x 1 alex users 16810 Июл  8  2010 woof

Из листинга 13 становится понятно, что переименование выполняется по схеме команды mv, то есть, фактически происходит замена файлов со старыми именами на файлы с новыми именами. Ещё один важный аспект переименований с помощью утилит lowercase/uppercase, о котором следует сказать особо: если файлы для переименования задаются с использованием полного абсолютного или частичного относительного путей, то преобразование выполняется только неппосредственно для имени и расширения, а какой бы то ни было элемент пути к обрабатываемому файлу остаётся неизменным.

Несравненно бóльшие возможности по переименованию файлов предоставляют утилиты из extra-пакета - frenum и pren (последняя позволяет использовать при переименовании регулярные выражения языка Perl).

Для поиска дублирующихся файлов в заданных каталогах удобна утилита repeats, работа которой демонстрируется в листинге 14.

Листинг 14. Результат работы команды repeats
$ repeats . ..
../prog/mercury/Mercury/c_dates/hello.c_date	
../prog/mercury/Mercury/date3s/hello.date3
../prog/mercury/Mercury/date3s/hello.date3	
../prog/mercury/Mercury/dates/hello.date
../prog/mercury/Mercury/dates/hello.date	
../prog/mercury/Mercury/err_dates/hello.err_date
../prog/mercury/Mercury/int2s/hello.int2	
../prog/mercury/Mercury/int3s/hello.int3
$ repeats -h
repeats 1.0.31
usage: repeats [-a hash_algorithm] [-h(elp)] [-l(inks_hard)]
         [-m(idsize) bytecount] [-p(aranoid)] [-v(erbose)] [-z(eros)]
         [directory ...]
algorithms:  1 = MD5, 2 = SHA1, 3 = SHA224, 4 = SHA256 (default),
             5 = SHA384, 6 = SHA512

Следующие три утилиты выполняют замены в содержимом заданных текстовых файлов. Программа notabs заменяет все символы табуляции на пробелы. Программа notrail удаляет все "хвостовые" пробелы в строках текстовых файлов. Программа lreplace выполняет подстановки (замены) строк в текстовых файлах, как показано в листинге 15.

Листинг 15. Работа команды lreplace и ключи команд notabs и notrail
$ notabs -h
notabs 1.0.31
usage: notabs [-h(elp)] filename ...
$ notrail -h
notrail 1.0.31
usage: notrail [-h(elp)] [-q(uiet)] [-v(erbose)] filename ...
$ lreplace -h
lreplace 1.0.31
usage: lreplace [-d delimiter] -i INSTRING -o OUTSTRING [-h(elp)] filename ...
$ cat lines.test 
Процессор - это элемент компьютера.
Жёсткий диск - это элемент компьютера.
Клавиатура - это элемент компьютера.
$ lreplace -i "- это" -o "представляет собой" lines.test 
lines.test: text replaced
[ ~/.../test ]$ cat lines.test 
Процессор представляет собой элемент компьютера.
Жёсткий диск представляет собой элемент компьютера.
Клавиатура представляет собой элемент компьютера.

Утилита wipe-free перезаписывает нулями всё свободное пространство раздела диска (см. листинг 16).

Листинг 16. Работа программы wipe-free
$ wipe-free -h
wipe-free 1.0.31
usage: wipe-free [-b block_size] [-c count] [-m max_chunks] [-h(elp)]
  default: wipe-free -b 4096 -c 262144 -m 4096
$ wipe-free
wipe-free message: beginning zero-file writes...
  file 0001: 1073741824 bytes in 17.150 seconds as ./zero0001_16362_dq0MQs.dat
  file 0002: 1073741824 bytes in 14.482 seconds as ./zero0002_16362_Rpn0Zd.dat
  file 0003: 1073741824 bytes in 15.030 seconds as ./zero0003_16362_TSS8KK.dat
  file 0004: 1073741824 bytes in 15.287 seconds as ./zero0004_16362_Plro1J.dat
  file 0005: 1073741824 bytes in 15.772 seconds as ./zero0005_16362_KPZDlJ.dat
  ...
  file 0041: 1073741824 bytes in 17.343 seconds as ./zero0041_20916_kFJV1B.dat
  file 0042: 1073741824 bytes in 19.576 seconds as ./zero0042_20916_J9Rwpf.dat
  file 0043: 1073741824 bytes in 17.019 seconds as ./zero0043_20916_2AQzSO.dat
  file 0044: 1073741824 bytes in 17.635 seconds as ./zero0044_20916_g7VDf5.dat
  file 0045: 421666816 bytes in 7.049 seconds as ./zero0045_20916_VOK4yG.dat
  file 0046: 0 bytes in 0.248 seconds as ./zero0046_20916_7ie24Y.dat
wipe-free message: free space filled with zeros
wipe-free message: deleting zero files
$

3. Группа утилит, работающих с архивами

Интересная группа команд to-qzip, to-bzip, to-7zip, to-lzip, to-lzma, to-xz выполняет преобразование в соответствующий формат архива уже существующие архивные файлы .Z (compress), .lzo (lzop), .gz, .bz2. Примеры преобразования приведены в листинге 17.

Листинг 17. Преобразование архивных файлов в альтернативные форматы
$ tar cvzf test.tar.gz *
lines.test
readme
woof
$ to-xz test.tar.gz 
test.tar.gz... done
$ to-bzip test.tar.gz
test.tar.gz... done
$ to-7zip test.tar.gz
test.tar.gz... done
$ to-lzma test.tar.gz
test.tar.gz... done
$ ls -l
итого 72
-rw-r--r-- 1 senex users   284 Апр 11 22:49 lines.test
-rw-r--r-- 1 senex users  4381 Фев  7 17:00 readme
-rw-r--r-- 1 senex users  6535 Апр 11 23:30 test.tar.7z
-rw-r--r-- 1 senex users  7431 Апр 11 23:29 test.tar.bz2
-rw-r--r-- 1 senex users  7536 Апр 11 23:28 test.tar.gz
-rw-r--r-- 1 senex users  7125 Апр 11 23:30 test.tar.lzma
-rw-r--r-- 1 senex users  7172 Апр 11 23:28 test.tar.xz
-rwxr-xr-x 1 senex users 16810 Июл  8  2010 woof
$ to-xz -h
to-xz 1.0.31
usage: to-xz [-d(el_orig)] [-k(eep_smallest)] [-m(ax_compression)]
               [-n(o_overwrite)] [-h(elp)] filename ...
$ to-bzip -h
to-bzip 1.0.31
usage: to-bzip [-d(el_orig)] [-k(eep_smallest)] [-n(o_overwrite)]
               [-h(elp)] filename ...
$ to-gzip -h
to-gzip 1.0.31
usage: to-gzip [-d(el_orig)] [-k(eep_smallest)] [-n(o_overwrite)]
               [-h(elp)] filename ...
$ to-lzma -h
to-lzma 1.0.31
usage: to-lzma [-d(el_orig)] [-k(eep_smallest)] [-m(ax_compression)]
               [-n(o_overwrite)] [-h(elp)] filename ...
$ to-7zip -h
to-7zip 1.0.31
usage: to-7zip [-d(elete_original)] [-k(eep_smallest)] [-m(ax_compression)]
               [-n(o_overwrite)] [-l(zma_only) [-p(pmd only)] [-h(elp)]
               filename ...

4. Группа утилит, работающая с изображениями

Это 3 утилиты, пытающиеся оптимизировать изображения без потерь качества: opt-gif, opt-jpg, opt-png, и они способны уменьшить размер соответствующих файлов на величину от 5 до 15% (в основном за счёт удаления неиспользуемых элементов палитр). Если установлен extra-пакет, то добавляется утилита opt-pdf, оптимизирующая pdf-файлы с помощью Ghostscript.

Если некоторая потеря качества допустима, то можно воспользоваться утилитой recomp-jpg, выполняющей преобразование JPEG-изображения к более низкому уровню качества.

Ещё 4 утилиты предназначены для простых операций с файлами изображений:

  • imagsize - определяет размер и некоторые другие характеристики изображения, содержащегося в заданном файле;
  • jpgcom - выводит все комментарии из заданных JPEG-файлов;
  • pngrecolor - перезаписывает PNG-файл с минимальной палитрой;
  • pngstrip - перезаписывает PNG-файл, удаляя из него при этом всю лишнюю, ненужную информацию.

Заключение

Утилиты из пакета littleutils очень просты и удобны в работе. Большинство из них можно использовать как в интерактивном режиме, так и в составе конвейеров команд, а также в скриптах командной оболочки. Может показаться, что некоторые утилиты дублируют функции "стандартных" программ из пакета coreutils (например, все file-утилиты схожи с командой stat), но сам Брайан Линдхолм отмечает два небольших преимущества своих утилит: во-первых, они чуть более просты в использовании, а во-вторых, они способны обрабатывать произвольное количество файлов без помощи xargs (за счёт применения ключей -f и -p).


Ресурсы для скачивания


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source
ArticleID=968717
ArticleTitle=Набор программ для командной строки littleutils
publish-date=04162014