С использованием apt-файл
Я могу найти пакеты, предоставляющие определенные исполняемые файлы, например:
sudo apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/wget
А на самом деле:
sudo apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/wget | grep "/wget$"
(Потому что в противном случае он просто вернул бы все пакеты, содержащие исполняемые файлы, начинающиеся с wget
.)
Теперь я бежал:
EXEC_NAME="x86_64-w64-mingw32-g++"
sudo apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/${EXEC_NAME} | grep "${EXEC_NAME}$"
И что удивительно, он ничего не возвращает. Почему? Потому что ни один пакет не предоставляет файл с таким именем.
Если я бегу:
EXEC_NAME="x86_64-w64-mingw32-g++"
sudo apt-file search {/bin,/sbin,/usr/bin/,/usr/sbin}/${EXEC_NAME}
Я получаю следующий результат:
g++-mingw-w64-x86-64-posix: /usr/bin/x86_64-w64-mingw32-g++-posix
g++-mingw-w64-x86-64-win32: /usr/bin/x86_64-w64-mingw32-g++-win32
подразумевая, что нет пакета, предоставляющего x86_64-w64-mingw32-g++
.
Но через некоторое время я обнаружил, что g++-mingw-w64-x86-64-posix
не просто предоставляет исполняемый файл g++-mingw-w64-x86-64-posix
, но также псевдоним или символическая ссылка, называемая g++-mingw-w64-x86-64
.
В данном случае это было легко понять, потому что в пакете оказался другой бинарник с очень похожим именем. Теперь моя проблема заключается в том, что мне нужно автоматизировать это таким образом, чтобы он работал для любого псевдонима/символической ссылки, даже для тех, которые имеют совершенно другое имя.
Как я могу это сделать?
Редактировать:
Псевдоним создается в файле g++-mingw-w64-x86-64-posix.postinst
принадлежащий g++-mingw-w64-x86-64-posix
пакет, если это поможет:
update-alternatives --install /usr/bin/x86_64-w64-mingw32-g++ x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix 30 \
--slave /usr/bin/x86_64-w64-mingw32-c++ x86_64-w64-mingw32-c++ /usr/bin/x86_64-w64-mingw32-c++-posix
Редактировать2:
Может быть, есть способ поиска содержимого файла всех пакетов? .postinst
файлы? Может быть, скачав все .postinst
файлы в кеш? Может быть, это можно сделать, сначала загрузив заголовок файла каждого пакета, чтобы увидеть, в каких байтах в архивах расположены файлы .postinst, а затем использовать HTTP-запросы диапазона для их загрузки?
Редактировать3:
Это ничего не меняет, но я обнаружил, что вместо grep и cut вы можете просто использовать -Икс
и -л
флаг. Это делает команду немного короче:
sudo apt-file search -l -x "^/(bin|sbin|usr/bin|usr/sbin)/${EXEC_NAME}$" | голова -1