Леность ли моя тому причиной или болезненная неприязнь к комбайнам, но у меня как-то не сложились отношения с большими толстыми довольными 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. Deosis
    05.09.2017 07:38
    +1

    юниксвейненько получается

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


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


    1. Assador Автор
      05.09.2017 12:35

      Можно. Но смысл записи в лог как раз в том, чтобы перед удалением файлов просмотреть этот список и убрать оттуда строки с файлами, которые удалять не надо.


    1. asergrisa
      05.09.2017 12:35
      +1

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


      1. Assador Автор
        05.09.2017 12:42

        Именно. После редактирования (при необходимости) 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

        Но я бы не стал. Как я уже писал, неупоминаемость файлов — лишь один из признаков ненужности. Так можно удалить что-нибудь нужное.


    1. Assador Автор
      05.09.2017 13:29

      И, кстати, в вашем примере без ключа -p скрипт пишет в лог также суммирующую информацию, так что пайпить уже не комильфо. Вот, кстати, вопрос, надо ли писать в лог эту инфу…


      1. Deosis
        06.09.2017 08:51
        +1

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


        1. Assador Автор
          06.09.2017 09:42

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