Леность ли моя тому причиной или болезненная неприязнь к комбайнам, но у меня как-то не сложились отношения с большими толстыми довольными IDE. Довольствуюсь простым ламповым Geany и несколькими самописными скриптами, количество коих растёт по мере необходимости.
С одной стороны, минусы очевидны — все эти скрипты часто повторяют функционал больших сред разработки; велосипеды — в массы. Но с другой стороны, я получаю ровно то, что нужно и удобно мне. Да и, потом, юниксвейненько получается: понадобилось забить гвозь — берёшь молоток, а не нанимаешь строительный кран с бригадой рабочих и прорабом.
О некоторых таких скриптах решил попробовать писать сюда. Может, кому пригодятся (да и заточить под себя какой-нибудь из них всегда можно). Если нет — ругайтесь в комментариях, учту. Итак.
Поиск сирот (ds-findorphaned)
При работе над более-менее большими проектами, какими бы мы педантами не были, порой скапливается приличное количество файлового мусора. Картинки, CSS-ки, временные версии. Разумеется всё это нужно организовывать тем или иным способом — названиями, метками, расположением — как угодно. Но в пылу творчества о чём-нибудь да забудешь. Оно и весит, вроде как, немного, но… неаккуратно. Порой хочется почистить проект, а для этого нужно ещё этот мусор отыскать среди другого мусора нужных файлов.
Одним из признаков нужности файла является его упоминание в других файлах. В других нужных файлах. Всяческие инклюды, пути к картинкам в CSS-ках и т. п. Сразу нужно оговориться, что это далеко не единственный признак. Во-первых, нужный файл может в других не упоминаться. Во-вторых, может упоминаться в других, но эти другие не нужны сами. Но. Всё-таки, если файл больше нигде не упоминается, имеет смысл обратить на него внимание.
Собственно, для поиска таких одиночных файлов я и написал небольшой скриптик (Perl, CLI — описание, гитхаб). Всё просто. В ключах скрипта указывается:
-d
— Каталог с файлами, которые хочется проверить на сиротство. Отдельным ключом-r
задаётся рекурсивный поиск в этом каталоге.-f
— Маска (регулярное выражение) имён файлов, которые хочется проверить на сиротство.-D
— Каталог с файлами в которых ищется упоминание заданных выше возможно сиротских файлов. Ещё одним отдельным ключом-R
задаётся рекурсивный поиск в этом каталоге.-F
— Маска (регулярное выражение) имён файлов, в которых ищется упоминание заданных выше возможно сиротских файлов.
Ну и три вспомогательных ключа:
-p
— Способ выдачи результата обычным списком в консоль, по строке на файл. Без ключа дополнительно выводится суммирующая информация и предложение эти файлы удалить.-e
— С этим ключом можно указать конкретную кодировку анализируемых файлов на случай, если с этим не справится “Enca” (что вряд ли), включающаяся в работу по умолчанию, если этот ключ не указан.-l
— Запись результатов поиска в указанный этим ключом лог-файл.
Разумеется, каталоги для поиска и маски имён могут пересекаться вплоть до полного совпадения. По умолчанию, кстати, если эти ключи не заданы, оба каталога принимаются за текущий (./
) и обе маски означают любые имена (.*
). Рекурсивность поиска же при этом по умолчанию выключена, чтобы не взорвать диск и
Для примера:
$ ds-findorphaned -prR -l "~/log.txt" -d "~/maybe_orphaned_images" -f ".*.jpg$" -D "~/search_here, ~/and_here" -F ".*.php$"
Результатом будет список всех .jpg-файлов, находящихся в ~/maybe_orphaned_images
(и подкаталогах, рекурсивно), не упоминающихся ни в одном из .php-файлов, находящихся в ~/search_here
и ~/and_here
(и подкаталогах, рекурсивно).
Я сам обычно запускаю скрипт с ключами -p
и -l
, чтобы потом открыть лог, просмотреть, удалить строки с заведомо нужными файлами и скормить оставшееся rm
-у или mv
.
И ещё раз. Неупоминание — лишь один из признаков ненужности файла, так что скрипт — лишь вспомогательный инструмент для принятия решения. Но по мне так инструмент полезный.
Прикручу ещё голосовалку, чтобы понять, стоит ли мне в дальнейшем писать о подобных полезностях.
Автор: Assador