In these modern times (2020 is practically the 3rd decade of the 21st century after all),
I think the correct question is how do I find all the non-utf-8 files? Utf-8 being the modern equivalent of a text file.
utf-8 encoding of text with non-ascii code points will introduce non-ascii bytes (i.e., bytes with the most significant bit set). Now, not all sequences of such bytes form valid utf-8 sequences.
isutf8 from the moreutils package is what you need.
$ isutf8 -l /bin/*
/bin/[
/bin/acyclic
/bin/addr2line
/bin/animate
/bin/applydeltarpm
/bin/apropos
⋮
A quick check:
$ file $(isutf8 -l /bin/*)
/bin/[: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=4d70c2142fc672d8a69d033ecb6693ec15b1e6fb, for GNU/Linux 3.2.0, stripped
/bin/acyclic: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=d428ea52eb0e8aaf7faf30914710d8fbabe6ca28, for GNU/Linux 3.2.0, stripped
/bin/addr2line: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=797f42bc4f8fb754a49b816b82d6b40804626567, for GNU/Linux 3.2.0, stripped
/bin/animate: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=36ab46e69c1bfea433382ffc9bbd9708365dac2b, for GNU/Linux 3.2.0, stripped
/bin/applydeltarpm: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=a1fddcbeec9266e698782596f2dfd1b4f3e0b974, for GNU/Linux 3.2.0, stripped
/bin/apropos: symbolic link to whatis
⋮
You may wish to invert the test and get all the text files.
Use -i
:
$ isutf8 -il /bin/*
/bin/alias
/bin/bashbug
/bin/bashbug-64
/bin/bg
⋮
$ file -L $(isutf8 -il /bin/*)
/bin/alias: a /usr/bin/sh script, ASCII text executable
/bin/bashbug: a /usr/bin/sh - script, ASCII text executable, with very long lines
/bin/bashbug-64: a /usr/bin/sh - script, ASCII text executable, with very long lines
/bin/bg: a /usr/bin/sh script, ASCII text executable
⋮
Yeah, it reads the whole file, but it’s pretty speedy, and if you want accuracy…
You can use the Unix file
utility, which can tell you what a file is based on its contents. You will need either the Cygwin environment or a win32-port package like GnuWin32 or UnxUtils.
Here’s how file
works:
# previously, e.exe was renamed to e.jpg
$ file e.jpg
e.jpg: MS-DOS executable PE for MS Windows (console) Intel 80386 32-bit
Obviously, you have to give file
a filename (or list of filenames) as an argument(s). You could do this with find
if you know roughly where the file should be, by using find
and a folder name:
$ find <foldername> -type f -print0 | xargs -0 file
If you combine this with grep
, you can strip out the non-executables:
$ find e-0.02718 -type f -print0 | xargs -0 file | grep executable
e-0.02718/e.jpg: MS-DOS executable PE for MS Windows (console) Intel 80386 32-bit
e-0.02718/e.linux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), stripped
e-0.02718/e.sun4u56: ELF 32-bit MSB executable, SPARC, version 1 (SYSV), dynamically linked (uses shared libs), stripped
e-0.02718/EXAMPLES: Bourne shell script text executable
e-0.02718/makefile: script text executable for make -f
Cygwin and GnuWin32 both provide the file
and find
commands (via the file
and findutils
packages).
UnxUtils includes find
, but I can’t verify that the file
command is included. The package does not appear to be maintained, so GnuWin32 is probably a better option.
Перевод статьи How to Read Binary Files in Python.
Файл, содержащий бинарные данные, называется двоичным (бинарным) файлом. Любые форматированные и неформатированные бинарные данные хранятся в бинарных файлах, нечитабельных для человека и использующихся компьютером напрямую.
Когда бинарный файл требуется просмотреть или переместить, содержимое файла переводится в формат, понятный человеку. Бинарный файл имеет расширение .bin. Прочитать его можно с помощью встроенной функции или модуля. В этом уроке мы разберём различные способы чтения бинарных файлов с помощью Python.
Подготовка
Перед тем, как начать урок, желательно создать один или несколько бинарных файлов, чтобы воспользоваться скриптом из примера. Ниже представлены два скрипта на Python, которые создадут два бинарника. Файл binary1.py создаёт string.bin, содержащий строковые данные, а binary2.py – number_list.bin со списком из числовых данных.
Binary1.py
# Создаём бинарный файл file_handler = open("string.bin", "wb") # Добавляем две строки в бинарный файл file_handler.write(b"Welcome to LinuxHint.nLearn Python Programming.") # Закрываем чтение file_handler.close()
Binary2.py
# Создаём бинарный файл file=open("number_list.bin","wb") # Объявляем список с числовыми данными numbers=[10,30,45,60,70,85,99] # Конвертируем список в массив barray=bytearray(numbers) # Записываем массив в файл file.write(barray) file.close()
Считываем бинарный файл со строковыми данными в массив байтов
В Python существует множество способов прочитать бинарный файл. Можно прочитать определённое количество байтов или весь файл сразу.
В приведенном ниже коде функция open()
открывает для чтения string.bin, а функция read()
на каждой итерации цикла while
считывает по 7 символов в файле и выводит их. Далее мы используем функцию read()
еще раз, но уже без аргументов — для считывания всего файла. После считывания содержимое выводится на экран.
# Открываем бинарный файл на чтение file_handler = open("string.bin", "rb") # Читаем первые 7 байтов из файла data_byte = file_handler.read(7) print("Print three characters in each iteration:") # Проходим по циклу, чтобы считать оставшуюся часть файла while data_byte: print(data_byte) data_byte = file_handler.read(7) # Записываем всё содержимое файла в байтовую строку with open('string.bin', 'rb') as fh: content = fh.read() print("Print the full content of the binary file:") print(content)
Результат
После выполнения скрипта мы получим следующий результат.
Считываем бинарный файл со строковыми данными в массив
Следующий скрипт поможет нам прочитать бинарник number_list.bin, созданный нами ранее.
# Открываем на чтение бинарный файл file = open("number_list.bin", "rb") # Считываем в список первые 5 элементов number = list(file.read(5)) # Выводим список print(number) # Закрываем файл file.close()
Бинарный файл содержит список с числовыми данными. Как и в предыдущем примере, функция open()
открывает файл и читает из него данные. Затем из бинарника читаются первые 5 чисел и перед выводом объединяются в список.
Результат
После выполнения скрипта мы получим следующий результат. Бинарный файл содержит 7 чисел, первые 5 вывелись на консоль.
Читаем бинарный файл с помощью NumPy
В этой части мы поговорим о том, как создать бинарный файл и прочитать его с помощью массивов NumPy. Перед началом работы необходимо установить модуль NumPy командой в терминале или через ваш редактор Python, в котором вы будете писать программу.
Функция tofile()
создаёт текстовый или бинарный файл, а fromfile()
считывает данные из файла и создаёт массив.
Синтаксис tofile()
ndarray.tofile(file, sep='', format='%s')
Первый аргумент обязательный – он принимает имя файла, путь или строку. Файл создастся, только если будет указан первый аргумент. Второй аргумент – необязательный, он используется для разделения элементов массива. Третий аргумент также необязателен, он отвечает за форматированный вывод содержимого файла.
Синтаксис fromfile()
numpy.fromfile(file, dtype=float, count=- 1, sep='', offset=0, *, like=None)
Первый аргумент обязательный – он принимает имя файла, путь или строку. Содержимое файла будет прочитано, только если вы укажете имя файла. dtype
определяет тип данных в возвращаемом массиве. Count
задаёт число элементов массива. Sep
– для разделения элементов текста или массива. Offset
определяет позицию в файле, с которой начинается считывание. Последний аргумент нужен, чтобы создать массив, не являющийся массивом NumPy.
Напишем следующий код, чтобы создать бинарный файл с помощью массива NumPy, прочитать его и вывести содержимое.
# Импортируем NumPy import numpy as np # Объявляем массив numpy nparray = np.array([34, 89, 30, 45, 90, 11]) # Создаём бинарный файл из numpy-массива nparray.tofile("list.bin") # Выведем данные из бинарного файла print(np.fromfile("list.bin", dtype=np.int64))
Результат
После выполнения скрипта мы увидим следующий результат.
Заключение
Мы рассмотрели 3 разных способа чтения бинарных файлов. В первом примере мы получили содержимое файла в виде массива байтов, во втором и третьем – в виде списка.
Содержание
- Команда find в Linux – мощный инструмент сисадмина
- Поиск по имени
- Поиск по типу файла
- Поиск по размеру файла
- Единицы измерения файлов:
- Поиск пустых файлов и каталогов
- Поиск времени изменения
- Поиск по времени доступа
- Поиск по имени пользователя
- Поиск по набору разрешений
- Операторы
- Действия
- -delete
- Заключение
- How to find all binary executables recursively within a directory?
- 4 Answers 4
- Not the answer you’re looking for? Browse other questions tagged files find binary or ask your own question.
- Related
- Hot Network Questions
- Subscribe to RSS
- Поиск в Linux с помощью команды find
- Общий синтаксис
- Описание опций
- Примеры использования find
- Поиск файла по имени
- Поиск по дате
- По типу
- Поиск по правам доступа
- Поиск файла по содержимому
- С сортировкой по дате модификации
- Лимит на количество выводимых результатов
- Поиск с действием (exec)
- Чистка по расписанию
- How to find binary files in a directory?
- 7 Answers 7
- Original answer
- Edit 2
- Grep binary files on Linux
- bgrep
- bgrep2
- SearchBin
- hexgrep
Команда find в Linux – мощный инструмент сисадмина
Иногда критически важно быстро найти нужный файл или информацию в системе. Порой можно ограничиться стандартами функциями поиска, которыми сейчас обладает любой файловый менеджер, но с возможностями терминала им не сравниться.
Команда find – это невероятно мощный инструмент, позволяющий искать файлы не только по названию, но и по:
Данная команда будет очень полезна системным администраторам для:
Команда find в Linux производит поиск файлов и папок на основе заданных вами критериев и позволяет выполнять действия с результатами поиска.
Синтаксис команды find:
Поиск по имени
Следующая команда ищет файл s.txt в текущем каталоге:
В данном случае критерий -name учитывает только символы нижнего регистра и файл S.txt не появиться в результатах поиска. Чтобы убрать чувствительность к регистру необходимо использовать –iname.
Можно использовать название каталога для поиска. Например, чтобы с помощью команды find найти все png изображения в каталоге home:
Если выдает слишком много ошибок в отказе разрешения, тогда можно добавить в конец команды – 2> /dev/null. Таким образом сообщения об ошибках будут перенаправляться по пути dev/null, что обеспечит более чистую выдачу.
Поиск по типу файла
Критерий -type позволяет искать файлы по типу, которые бывают следующих видов:
Например, указав критерий -type d будут перечислены только каталоги:
Поиск по размеру файла
Допустим, что вам необходимо найти все большие файлы. Для таких ситуаций подойдет критерий -size.
В данном случае поиск выведет все файлы более 1 Гб (+1G).
Единицы измерения файлов:
Поиск пустых файлов и каталогов
Критерий -empty позволяет найти пустые файлы и каталоги.
Поиск времени изменения
Критерий -cmin позволяет искать файлы и каталоги по времени изменения. Для поиска всех файлов, измененных за последний час (менее 60 мин), нужно использовать -60:
Таким образом можно найти все файлы в текущем каталоге, которые были созданы или изменены в течение часа (менее 60 минут).
Для поиска файлов, которые наоборот были изменены в любое время кроме последнего часа необходимо использовать +60.
Поиск по времени доступа
Критерий -atime позволяет искать файлы по времени последнего доступа.
Таким образом можно найти файлы, к которым не обращались последние полгода (180 дней).
Поиск по имени пользователя
Опция –user username дает возможность поиска всех файлов и каталогов, принадлежащих конкретному пользователю:
Таким образом можно найти все файлы пользователя tisha в каталоге home, а 2>/dev/null сделает выдачу чистой без ошибок в отказе доступа.
Поиск по набору разрешений
Критерий -perm – ищет файлы по определенному набору разрешений.
Поиск файлов с разрешениями 777.
Операторы
Для объединения нескольких критериев в одну команду поиска можно применять операторы:
Например, чтобы найти файлы размером более 1 Гбайта пользователя tisha необходимо ввести следующую команду:
Если файлы могут принадлежать не только пользователю tisha, но и пользователю pokeristo, а также быть размером более 1 Гбайта.
Перед скобками нужно поставить обратный слеш «».
Действия
К команде find можно добавить действия, которые будут произведены с результатами поиска.
-delete
Полезен, когда необходимо найти и удалить все пустые файлы, например:
Перед удалением лучше лишний раз себя подстраховать. Для этого можно запустить команду с действием по умолчанию -print.
Данное действие является особенным и позволяет выполнить команду по вашему усмотрению в результатах поиска.
С помощью –exec можно написать альтернативу команде –delete и применить ее к результатам поиска:
Другой пример использования действия -exec:
Заключение
Команду find можно использовать для поиска:
С полученными результатами можно сразу выполнять различные действия, такие как:
Команда find может сильно облегчить жизнь системному администратору, а лучший способ овладеть ей – больше практиковаться.
Источник
How to find all binary executables recursively within a directory?
If I use find command like this:
all executable files are listed (excluding directories), and including executable script file (like script.sh, etc). What I want to do is list only binary executable files.
4 Answers 4
You might try the file utility. According to the manpage:
You might have to play around with the regular expression but something like:
file has lots of options, so you might want to take a closer look at the man page. I used the first option I found that seemed to output easily-to-grep output.
Here’s a way to exclude scripts, i.e., files whose first two characters are #! :
Just in case you find yourself on a system with a downlevel find (there are still, as I write, a lotta science clusters running RHEL5!) without the rights to update: instead of
in the above excellent answers, you can do, e.g.,
which searches on permission bits. Unfortunately the above only finds files for which the user has executable, but that usually works for me.
I coded a tool, called blobs, that does that.
The other methods miss some files.
Not the answer you’re looking for? Browse other questions tagged files find binary or ask your own question.
Hot Network Questions
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.10.20.40515
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Источник
Поиск в Linux с помощью команды find
Утилита find представляет универсальный и функциональный способ для поиска в Linux. Данная статья является шпаргалкой с описанием и примерами ее использования.
Общий синтаксис
— путь к корневому каталогу, откуда начинать поиск. Например, find /home/user — искать в соответствующем каталоге. Для текущего каталога нужно использовать точку «.».
— набор правил, по которым выполнять поиск.
* по умолчанию, поиск рекурсивный. Для поиска в конкретном каталоге можно использовать опцию maxdepth.
Описание опций
Тип объекта поиска. Возможные варианты:
Также доступны логические операторы:
Полный набор актуальных опций можно получить командой man find.
Примеры использования find
Поиск файла по имени
1. Простой поиск по имени:
* в данном примере будет выполнен поиск файла с именем file.txt по всей файловой системе, начинающейся с корня /.
2. Поиск файла по части имени:
* данной командой будет выполнен поиск всех папок или файлов в корневой директории /, заканчивающихся на .tmp
3. Несколько условий.
а) Логическое И. Например, файлы, которые начинаются на sess_ и заканчиваются на cd:
б) Логическое ИЛИ. Например, файлы, которые начинаются на sess_ или заканчиваются на cd:
в) Более компактный вид имеют регулярные выражения, например:
* где в первом поиске применяется выражение, аналогичное примеру а), а во втором — б).
* в данном примере мы воспользовались логическим оператором !.
Поиск по дате
1. Поиск файлов, которые менялись определенное количество дней назад:
* данная команда найдет файлы, которые менялись более 60 дней назад.
* покажет все файлы, которые менялись, начиная с 02.11.2019 00:00.
* найдет все файлы, которые менялись в промежутке между 31.10.2019 и 01.11.2019 (включительно).
* все файлы, к которым обращались с 08.10.2019.
* все файлы, к которым обращались в октябре.
* все файлы, созданные с 07 сентября 2019 года.
* файлы, созданные с 07.09.2019 00:00:00 по 09.09.2019 07:50
По типу
Искать в текущей директории и всех ее подпапках только файлы:
* f — искать только файлы.
Поиск по правам доступа
1. Ищем все справами на чтение и запись:
2. Находим файлы, доступ к которым имеет только владелец:
Поиск файла по содержимому
* в данном примере выполнен рекурсивный поиск всех файлов в директории / и выведен список тех, в которых содержится строка content.
С сортировкой по дате модификации
* команда найдет все файлы в каталоге /data, добавит к имени дату модификации и отсортирует данные по имени. В итоге получаем, что файлы будут идти в порядке их изменения.
Лимит на количество выводимых результатов
Самый распространенный пример — вывести один файл, который последний раз был модифицирован. Берем пример с сортировкой и добавляем следующее:
Поиск с действием (exec)
1. Найти только файлы, которые начинаются на sess_ и удалить их:
* -print использовать не обязательно, но он покажет все, что будет удаляться, поэтому данную опцию удобно использовать, когда команда выполняется вручную.
2. Переименовать найденные файлы:
3. Вывести на экран количество найденных файлов и папок, которые заканчиваются на .tmp:
* в данном примере мы ищем все каталоги (type d) в директории /home/user и ставим для них права 2700.
5. Передать найденные файлы конвееру (pipe):
* в данном примере мы использовали find для поиска строки test в файлах, которые находятся в каталоге /etc, и название которых заканчивается на .conf. Для этого мы передали список найденных файлов команде grep, которая уже и выполнила поиск по содержимому данных файлов.
6. Произвести замену в файлах с помощью команды sed:
* находим все файлы в каталоге /opt/project и меняем их содержимое с test на production.
Чистка по расписанию
Команду find удобно использовать для автоматического удаления устаревших файлов.
Открываем на редактирование задания cron:
* в данном примере мы удаляем все файлы и папки из каталога /tmp, которые старше 14 дней. Задание запускается каждый день в 00:00.
* полный путь к исполняемому файлу find смотрим командой which find — в разных UNIX системах он может располагаться в разных местах.
Источник
How to find binary files in a directory?
I need to find the binary files in a directory. I want to do this with file, and after that I will check the results with grep. But my problem is that I have no idea what is a binary file. What will give the file command for binary files or what should I check with grep?
7 Answers 7
This finds all non-text based, binary, and empty files.
Solution with only grep (from Mehrdad’s comment):
Original answer
This does not require any other tool except find and grep :
-I tells grep to assume binary files as unmatched
-L prints only unmatched files
. matches anything else
Edit 2
This finds all non-empty binary files:
It’s not totally foolproof as it only looks in the first 1,000 characters or so, but it’s better than some of the ad-hoc methods suggested here. See man perlfunc for the whole rundown. Here is a summary:
The «-T» and «-B» switches work as follows. The first block or so of the file is examined to see if it is valid UTF-8 that includes non-ASCII characters. If, so it’s a «-T» file. Otherwise, that same portion of the file is examined for odd characters such as strange control codes or characters with the high bit set. If more than a third of the characters are strange, it’s a «-B» file; otherwise it’s a «-T» file. Also, any file containing a zero byte in the examined portion is considered a binary file.
Источник
Grep binary files on Linux
We explored techniques to search a binary file using grep in an earlier article. However, we could only search ASCII strings using grep. In this article we will explore some powerful utilities which can perform ascii as well as hexadecimal string search on binary files.
bgrep
bgrep is as simple as it gets. It is written in C. It searches for a hex string and can show user-specified leading or trailing bytes (or both) from the occurrence of the match. bgrep accepts hex strings only.
bgrep has 3 useful options to show matches:
Let’s run bgrep on the bgrep binary:
bgrep2
bgrep2 follows brep but finds ascii strings as well. It’s also written in C (independently). The binary name remains bgrep.
To match a hex value:
SearchBin
SearchBin is written in python. In addition to searching ascii and hex strings, it can also find one binary in another. However, the most powerful feature of SearchBin is the ability to use a wildcard (?) for any byte. It can search in files of any size.
Search for the text string “Tom” in binfile:.
Search for the hexidecimal pattern “AABBCCDDEE” in binfil:
Take the binary file pattern.bin, and searches for an exact match within binfile:
hexgrep
hexgrep is a powerful utility from the Arch community written in C. It can be compiled and used easily on any Linux platform. It can
hexgrep is very useful in cheat code hacking through analysis of live game memory dumps.
To install on Ubuntu, download the source code. Run:
Find all occurrences of the string “pacman” in the pacman executable:
Using mixed values:
Find a single, multibyte hexadecimal integer (note the endianness flag):
Find all instances of “man” not prefixed with “pac”:
Find all occurences of “p” followed by at most 20 bytes before “man” in pacman binary:
hexgrep comes with an extensive man page too.
Источник
Опция | Описание |
---|---|
-name | Поиск по имени. |
-iname | Регистронезависимый поиск по имени. |
-type |
An application usually consists of 3 different file types:
- binary files
- configuration files
- application data
Where does Linux (e.g., CentOS, RHEL) store the binary files for a given application? How can I find it out for an application?
Piper
2,5052 gold badges18 silver badges15 bronze badges
asked Feb 26, 2019 at 10:21
2
You can use whereis
for this task.
$ whereis python3
python3: /usr/bin/python3.5m /usr/bin/python3 /usr/bin/python3.5 /usr/lib/python3 /usr/lib/python3.5 /etc/python3 /usr/local/lib/python3.5 /usr/share/python3 /usr/share/man/man1/python3.1.gz
answered Feb 26, 2019 at 10:41
PankiPanki
6,0512 gold badges24 silver badges33 bronze badges
1
You might try using which
like so:
$ which zoom
/usr/bin/zoom
which is likely a symbolic link, so to find the actual real path
ls -la $(which zoom)
lrwxrwxrwx 1 root root 22 Apr 24 07:19 /usr/bin/zoom -> /opt/zoom/ZoomLauncher
answered Jul 20, 2022 at 14:31
lacostenycoderlacostenycoder
5942 gold badges6 silver badges16 bronze badges
2
To find the binary itself, another method is type
.
$ type python3
python3 is /usr/bin/python3
$
In terms of location for configuration files and data files, the best place to determine that is often the relevant man
page.
$ man python3 | grep -A10 FILES
FILES AND DIRECTORIES
These are subject to difference depending on local installation conven‐
tions; ${prefix} and ${exec_prefix} are installation-dependent and
should be interpreted as for GNU software; they may be the same. The
default for both is /usr/local.
${exec_prefix}/bin/python
Recommended location of the interpreter.
${prefix}/lib/python<version>
${exec_prefix}/lib/python<version>
$
answered Jul 20, 2022 at 14:37
stevesteve
21.4k5 gold badges47 silver badges74 bronze badges
In general, refer to the file-system-heirarchy (FSH) for this:
https://refspecs.linuxfoundation.org/FHS_3.0/fhs-3.0.html
A direct (and simplified) answer to your question is:
- binary files:
/usr/bin
for executables/usr/lib
for shared objects (libraries)
- configuration files
/etc
- application data
/var
for read-write stuff/usr/share
for architecture-independent, read-only data (like images)
If you are using a debian-based system, you can find what files are deployed by a specific application (package) with dpkg -L
:
$ dpkg-query -L xclip
/usr/bin/xclip
/usr/share/doc/xclip/README
/usr/share/doc/xclip/changelog.Debian.gz
/usr/share/doc/xclip/changelog.gz
/usr/share/doc/xclip/copyright
/usr/share/man/man1/xclip.1.gz
In this (abbreviated) case, we see package xclip
has a binary in /usr/bin
, some changelog and copyright stuff in /usr/share/doc/xclip
and a man page in /usr/share/man/man1
.
Other distros have other tools for the same thing.
answered Jul 20, 2022 at 15:12
StewartStewart
12.1k1 gold badge37 silver badges73 bronze badges
Shellscript what-about
I use the shellscript what-about
in order to show some basic information of executable programs, that are available via PATH
,
- where it is located
- what package it belongs to or can be installed from
- what kind of program it is (binary executable code, shellscript, shell built-in, alias, link …)
This bash
shellscript uses the tool dpkg
, that belongs to Debian and Ubuntu and can be used also in Linux distros developed from those two distros. If you want to see the whole content of a [debian] program package, you can use dpkg
or emacs
according to this link to AskUbuntu.
If you want to find the program package the program belongs to in some other distro, CentOS and RHEL were mentioned in the original question, you must replace dpkg
with the corresponding tool.
Here it is:
#!/bin/bash
LANG=C
inversvid="033[7m"
resetvid="033[0m"
if [ $# -ne 1 ]
then
echo "Usage: ${0##*/} <program-name>"
echo "Will try to find corresponding package"
echo "and tell what kind of program it is"
exit 1
fi
command="$1"
str=;for ((i=1;i<=$(tput cols);i++)) do str="-$str";done
tmp="$command"
first=true
curdir="$(pwd)"
tmq=$(which "$command")
tdr="${tmq%/*}"
tex="${tmq##*/}"
if test -d "$tdr"; then cd "$tdr"; fi
#echo "cwd='$(pwd)' ################# d"
while $first || [ "${tmp:0:1}" == "l" ]
do
first=false
tmp=${tmp##* }
tmq="$tmp"
tmp=$(ls -l "$(which "$tmp")" 2>/dev/null)
tdr="${tmq%/*}"
tex="${tmq##*/}"
if test -d "$tdr"; then cd "$tdr"; fi
# echo "cwd='$(pwd)' ################# d"
if [ "$tmp" == "" ]
then
tmp=$(ls -l "$tex" 2>/dev/null)
tmp=${tmp##* }
if [ "$tmp" == "" ]
then
echo "$command is not in PATH"
# package=$(bash -ic "$command -v 2>&1")
# echo "package=$package XXXXX 0"
bash -ic "alias '$command' > /dev/null 2>&1" > /dev/null 2>&1
if [ $? -ne 0 ]
then
echo 'looking for package ...'
package=$(bash -ic "$command -v 2>&1"| sed -e '0,/with:/d'| grep -v '^$')
else
echo 'alias, hence not looking for package'
fi
# echo "package=$package XXXXX 1"
if [ "$package" != "" ]
then
echo "$str"
echo "package: [to get command '$1']"
echo -e "${inversvid}${package}${resetvid}"
fi
else
echo "$tmp"
fi
else
echo "$tmp"
fi
done
tmp=${tmp##* }
if [ "$tmp" != "" ]
then
echo "$str"
program="$tex"
program="$(pwd)/$tex"
file "$program"
if [ "$program" == "/usr/bin/snap" ]
then
echo "$str"
echo "/usr/bin/snap run $command # run $command "
sprog=$(find /snap/"$command" -type f -iname "$command"
-exec file {} ; 2>/dev/null | sort | tail -n1)
echo -e "${inversvid}file: $sprog$resetvid"
echo "/usr/bin/snap list $command # list $command"
slist="$(/usr/bin/snap list "$command")"
echo -e "${inversvid}$slist$resetvid"
else
package=$(dpkg -S "$program")
if [ "$package" == "" ]
then
package=$(dpkg -S "$tex" | grep -e " /bin/$tex$" -e " /sbin/$tex$")
if [ "$package" != "" ]
then
ls -l /bin /sbin
fi
fi
if [ "$package" != "" ]
then
echo "$str"
echo " package: /path/program [for command '$1']"
echo -e "${inversvid} $package ${resetvid}"
fi
fi
fi
echo "$str"
#alias=$(grep "alias $command=" "$HOME/.bashrc")
alias=$(bash -ic "alias '$command' 2>/dev/null"| grep "$command")
if [ "$alias" != "" ]
then
echo "$alias"
fi
type=$(type "$command" 2>/dev/null)
if [ "$type" != "" ]
then
echo "type: $type"
elif [ "$alias" == "" ]
then
echo "type: $command: not found"
fi
cd "$curdir"
This shellscript can find a program that is ‘behind’ a link or a series of links.
See also this link to AskUbuntu, where there are some demo examples.
answered Jul 20, 2022 at 15:36
sudodussudodus
5,97112 silver badges26 bronze badges