Простенький скрипт поиска возможно осиротевших файлов проекта

    Леность ли моя тому причиной или болезненная неприязнь к комбайнам, но у меня как-то не сложились отношения с большими толстыми довольными IDE. Довольствуюсь простым ламповым Geany и несколькими самописными скриптами, количество коих растёт по мере необходимости.

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

    О некоторых таких скриптах решил попробовать писать сюда. Может, кому пригодятся (да и заточить под себя какой-нибудь из них всегда можно). Если нет — ругайтесь в комментариях, учту. Итак.

    Поиск сирот (ds-findorphaned)


    При работе над более-менее большими проектами, какими бы педантами мы не были, порой скапливается приличное количество файлового мусора. Картинки, CSS-ки, временные версии. Разумеется всё это нужно организовывать тем или иным способом — названиями, метками, расположением — как угодно. Но в пылу творчества о чём-нибудь да забудешь. Оно и весит, вроде как, немного, но… неаккуратно. Порой хочется почистить проект, а для этого нужно ещё этот мусор отыскать среди другого мусора нужных файлов.

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

    Собственно, для поиска таких одиночных файлов я и написал небольшой скриптик (Perl, CLI — описание, гитхаб). Всё просто. В ключах скрипта указывается:

    • -d — Каталог с файлами, которые хочется проверить на сиротство. Отдельным ключом -r задаётся рекурсивный поиск в этом каталоге.
    • -f — Маска (регулярное выражение) имён файлов, которые хочется проверить на сиротство.
    • -D — Каталог с файлами, в которых ищется упоминание заданных выше возможно сиротских файлов. Ещё одним отдельным ключом -R задаётся рекурсивный поиск в этом каталоге.
    • -F — Маска (регулярное выражение) имён файлов, в которых ищется упоминание заданных выше возможно сиротских файлов.

    Ну и три вспомогательных ключа:

    • -v — Вывод дополнительной суммирующей информации и предложения найденные возможно сиротские файлы удалить. Без ключа скрипт просто перечисляет эти файлы с полными путями, по строке на файл.
    • -e — С этим ключом можно указать конкретную кодировку анализируемых файлов на случай, если с этим не справится “Enca” (что вряд ли), включающаяся в работу по умолчанию, если этот ключ не указан.
    • -l — Запись результатов поиска в указанный этим ключом лог-файл.

    Разумеется, каталоги для поиска и маски имён могут пересекаться вплоть до полного совпадения. По умолчанию, кстати, если эти ключи не заданы, оба каталога принимаются за текущий (./) и обе маски означают любые имена (.*). Рекурсивность поиска же при этом по умолчанию выключена, чтобы не взорвать диск и мозг компьютера на больших проектах.

    Для примера:

    $ ds-findorphaned -v -r -R -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 (и подкаталогах, рекурсивно).

    Я сам обычно запускаю скрипт с ключом -l (и без -v), чтобы потом открыть лог, просмотреть, удалить строки с заведомо нужными файлами и скормить оставшееся rm-у или mv.

    И ещё раз. Неупоминание — лишь один из признаков ненужности файла, так что скрипт — лишь вспомогательный инструмент для принятия решения. Но по мне так инструмент полезный.

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

    Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

    Стоит ли мне в дальнейшем писать о подобных мелких полезностях?
    Поделиться публикацией
    Комментарии 7
      +1
      юниксвейненько получается

      Можно удалить логику записи в лог и использовать перенаправление вывода.
      Удаление списка файлов перенести в отдельный скрипт, для удаления использовать следующее


      ds-findorphaned -rR -d "~/maybe_orphaned_images" -f ".*\.jpg$" -D "~/search_here, ~/and_here" -F ".*\.php$" | ds-deletefiles
        0
        Можно. Но смысл записи в лог как раз в том, чтобы перед удалением файлов просмотреть этот список и убрать оттуда строки с файлами, которые удалять не надо.
          +1

          Удаление списка файлов перенести в програму rm, а не городить еще один скрипт. Тогда вообще юниксвейненько будет.

            0
            Именно. После редактирования (при необходимости) log.txt, просто пишем

            $ cat 'log.txt' | xargs rm

            Ну или, если не собираемся просматривать и редактировать список файлов, можно и в одну строку:

            $ ds-findorphaned -prR -d "~/maybe_orphaned_images" -f ".*\.jpg$" -D "~/search_here, ~/and_here" -F ".*\.php$" | xargs rm

            Но я бы не стал. Как я уже писал, неупоминаемость файлов — лишь один из признаков ненужности. Так можно удалить что-нибудь нужное.
            0
            И, кстати, в вашем примере без ключа -p скрипт пишет в лог также суммирующую информацию, так что пайпить уже не комильфо. Вот, кстати, вопрос, надо ли писать в лог эту инфу…
              +1

              Обычно для вывода дополнительной информации используют ключ -v

                0
                Вообще, да. Так логичнее. Поправил сам скрипт, закоммитил, поменял описания в статье и на сайте. Спасибо.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое