В ОС Linux проповедуется принцип: одна утилита должна уметь выполнять только одно действие. Но выполнять это действие хорошо! К сожалению, этот принцип только декларируется и остается всего лишь словами. А на практике складывается другая ситуация: в Linux пользователь все время натыкается на проблемы, которые могли бы иметь простое решение, но только не в среде Linux! Бывают ситуации, когда простой вопрос имеет запредельно сложное решение. И это норма.
Простой пример: пользователю нужно получить список файлов из директории и её подкаталогов. Файлы нужно увидеть с полным путем.
Получение списка файлов через команду ls
Казалось бы, простая задача. Существует консольная команда ls с кучей опций. Эта команда специально предназначена для получения списков файлов в различных форматах. Уж она-то нам дйствительно поможет! Как бы не так. Пользователь может несколько часов разбираться с опциями этой команды, пока не поймет, что решить вышеуказанную задачу средствами утилиты ls в принципе невозможно.
Особенную пикантность ситуации придает то, что в ls предусмотрены опция вывода полного пути к файлу и опция рекурсивного обхода поддиректорий. Но толку от них нет никакого: получить простой список файлов с полным путем и со всех подкаталогов все равно не удасться.
Наиболее правильное решение такой задачки является составным. Для получения списка файлов нужно всего лишь преобразовать выхлоп утилиты ls через редактор командной строки awk. Вот готовая команда:
ls -R $PWD | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'
Не составляет труда запомнить эту последовательность символов, и использовать ее при работе в консоли Linux!
Опытные пользователи скажут: тебе сложно набрать всего четыре строки? Сделай алиас на эту команду! Проблема в том, что такая команда нужна не только для уютненького локалхоста у мамкиных админов, но и при работе с разнородными серверами. А у этих серверов может быть перекрыт не только доступ в интернет, но и вообще запрещен удаленный доступ. И посему, никакого копипаста не предусмотрено: набирать команды нужно ручками.
Список файлов можно получить командой find!
Еще более опытные гуру командной строки могут сказать: знаем мы про команду ls и про её закидоны. Ну вот не может она просто так дать нужный список файлов, ну не может. Зато мы умеем извращаться, и для получения списка файлов мы можем использовать не специально созданную для этого команду ls, а команду поиска файлов find!
Что может быть проще? Оп-ля:
find $PWD -type f
Вот и все! Но если посмотреть на полученный список файлов, можно обнаружить, что файлики-то идут в разнобой, без всякого упорядочевания. Вот какие первые inode попали под искомые параметры, в такой последовательности и будут выведены файлы. Да, список файлов будет полным. Но не упорядоченным. А ведь существуют задачи, для которых последовательность файлов важна. Например важно чтобы файлы одной поддиректории были в списке рядом, и небыли разбросаны по всему списку.
Пфф, какие проблемы? - скажет опытный гуру. Добавляй команду sort и получай упорядоченность! Оп-ля:
find $PWD -type f | sort
Но если посмотреть на результат работы этой команды, то можно увидеть следующую вещь:
data/aaafile.bin
data/bbbfile.bin
data/cccdir/dddfile.bin
data/eeefile.bin
data/ffffile.bin
Ой-ей-ей! А список-то все равно неоднородный. В этом списке все так же файлы из одной директории перемешаны с файлами из поддиректорий. Не решает задачу эта ваша команда find.
Вывод
Unix (и Linux как одна из его ветвей) существуют уже пол-века. Но для довольно простых задачь все еще не создано нормальных удобных решений. И неизвестно, появятся ли они когда-нибудь вообще. Что остается пользователям Linux? Только ждать, потому что даже если у какой-нибудь команды появится нужная опция, то внедрение таких изменений в дистрибутивы затянется на десятилетия.
Хорошая новость в том, что достойных альтернатив Linux все равно в настоящее время нет.