Linux узнать где лежит исполняемый файл

Обновлено: 03.07.2024

Многих новичков, недавно установивших Linux и только начавших разбираться в устройстве этой замечательной операционной системы, как и меня, в свое время, интересует вопрос: куда же устанавливаются программы в Ubuntu, да и вообще, в любом дистрибутиве Linux. Файловая система Linux очень сильно отличается от Windows и это в первое время сбивает с толку.

Мы привыкли, что все программы и их файлы в Windows находятся в системном каталоге Program Files и System32, или если не в нем, то хотя бы в одном из подкаталогов. Но в Linux все намного сложнее. Здесь файлы программ, как правило, распределены по всей файловой системе. Так куда устанавливаются программы в Linux? Как найти все файлы программы? Как удалять ненужные программы? Все это мы рассмотрим в данной статье.

Куда устанавливаются программы в Ubuntu

Здесь не все так просто. Чтобы ответить на этот вопрос сначала нужно разобраться в особенностях файловой системы Linux и способах установки программ. В корневой файловой системе Linux каждая папка предназначена для хранения определенного типа файлов, эти правила со временем менялись, да и сейчас меняются в зависимости от дистрибутива, но основные папки остаются одни и те же. В папке /bin (Binary - двоичный) - хранятся исполняемые файлы, /lib - подключаемые библиотеки, /usr - ресурсы и данные программ, это могут быть переводы, картинки и т д, в /var - временные данные, логи, кэши, /etc - конфигурационные файлы.

Большинство программ, устанавливаемых с помощью стандартного пакетного менеджера распределяются по файловой системе в эти папки. Вам, наверное, интересно, как система определяет какие файлы куда копировать. Она и не определяет, это задает разработчик во время сборки пакета. Попробуйте открыть deb пакет как архив. Кроме служебных информационных файлов, касающихся установки вы там увидите структуру папок напоминающую корневую ФС Linux, это и определяет какие файлы где будут находиться. В последнее время грань четкого разделения файлов по папкам немного стерлась, появились папки /usr/bin для исполняемых файлов, а кэш некоторые программы вообще хранят в домашней папке пользователя, но традиционные Linux сервисы, такие как Samba, Apache, Ngnix и многие другие четко придерживаются стандартной структуры.

Давайте разберем на примере как распределяется программа в файловой системе. Возьмем, например, тот же сервер apache. Чтобы узнать куда были скопированы файлы программы воспользуемся утилитой dpkg.

www-servers/apache-2.2.31 (/usr/sbin/apache2)
www-servers/apache-2.2.31 (/etc/init.d/apache2)
www-servers/apache-2.2.31 (/etc/logrotate.d/apache2)
www-servers/apache-2.2.31 (/var/cache/apache2)
www-servers/apache-2.2.31 (/usr/lib64/apache2)
www-servers/apache-2.2.31 (/usr/share/apache2)
www-servers/apache-2.2.31 (/etc/apache2)
www-servers/apache-2.2.31 (/usr/include/apache2)
www-servers/apache-2.2.31 (/etc/conf.d/apache2)
www-servers/apache-2.2.31 (/var/log/apache2)

Как видите, все файлы на своих местах.

Но из этого правила есть исключения. Например, многие проприетарные программы и игры устанавливаются полностью в одну папку, так же как и в Windows. Для таких программ есть папка /opt. Посмотрим, например, на Crossover:

sudo dpkg -s crossover-bin

Надеюсь, эта статья помогла вам разобраться с вопросом куда устанавливаются программы в Ubuntu.

Пишу скрипт, он определяет какой архитектуры исполняемый файл и подставляет ему нужные библиотеки.

При помощи команды

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

Как найти указанный в параметре исполняемый файл к которому не указан полный путь по переменной окружения?

Перемещено leave из talks



Дык, никак. А кто искать то будет? Пушкин?

Если скрипты в строго определенных директориях, то пропиши эти пути в самом скрипте.


Дык, никак. А кто искать то будет? Пушкин?

bash же как то ищет.

так он и ищет по путям в PATH


Если скрипты в строго определенных директориях, то пропиши эти пути в самом скрипте.

Программу предполагается использовать примерно так:


есть ли готовый парсер на bash для разбора этой переменной и поиска?


А как же революция?


зачем тебе это вообще могло понадобиться?


Тебе же первый ответивший дал правильный ответ.
Смотри:
readelf -h $(which wine) | grep ELF32
Класс: ELF32


есть ли готовый парсер на bash для разбора этой переменной и поиска?

ааааааааааааааа, кто там рядом живёт, стукните его по голове чем-нибудь тяжёлым. 1111

он же пишет, что ему нужен поиск вне PATH, which ничего не найдет


Мне всего 160км.


which он как яндекс — найдёт всё, что нужно, главное правильно спросить


Ты в Архызе сейчас?

че то тыы какую то пургу намел. Если добавить директорию в PATH, есен х, все отыщется. Че сказать то хотел? Зачем ты там с каким то копированием че-то делал?


Какая разница, какое это отношение к вопросу имеет?


Вот именно это сказать и хотел:

Если добавить директорию в PATH, есен х, все отыщется.
Зачем ты там с каким то копированием че-то делал?


Какая разница, какое это отношение к вопросу имеет?

Не, непонято, если исходить из вопроса ТС, как найти скрипт, которого нет в PATH. Ладно, забей, мне, видимо, не понять.



Скрипт, которого нет в $ при его старте только по одному имени выполняться один фиг не будет.
Если при запуске задавать полное имя скрипта, то каталог в котором этот скрипт лежит считай известен и его можно добавить в переменную PATH
Что ещё тебе не понятно? Не стесняйся, спрашивай.

pwd
echo $(dirname $0)

я об этом и сказал


Да, я знаю.
Мне непонятно, что тебе не нравится в запуске which с новой переменной PATH для поиска?

Просто, как бы, не совсем соответствует вопросу. Может я вопрос неверно понял, хз. Ладно, проехали.


В чем, собственно, проблема? %)


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

В этом случае исполняемый файл лежит в каталоге, содержащемся в PATH. Иначе надо вводить полный путь абсолютный, или относительный (что легко через dirname привести к первой задаче).
Как бы других-то способов нет и усложнять ничего не надо.

Абсолютно согласен, всё что можно было уже сказать по теме, в этой теме сказал самый первый комментатор :D

Как я могу найти только исполняемые файлы в определенном каталоге в Linux?

Проверка исполняемых файлов может выполняться с помощью -perm (не рекомендуется) или -executable (рекомендуется, поскольку он учитывает ACL). Чтобы использовать параметр -executable :

, если вы хотите найти только исполняемые файлы, а не каталоги, доступные для поиска, в сочетании с -type f :

Используйте опцию -perm для поиска. Это найдет файлы в текущем каталоге, которые либо исполняются их владельцем, либо членами группы, либо другими:

Я просто нашел еще один вариант, который присутствует, по крайней мере, в GNU find 4.4.0:

Это должно работать еще лучше, потому что ACL также рассматриваются.

Я знаю, что в этом вопросе конкретно упоминается Linux, но поскольку это первый результат в Google, я просто хотел добавить ответ, который я искал (например, если вы - как и я на данный момент, принужден вашим работодателем использовать система не GNU /Linux).

Протестировано на macOS 10.12.5

У меня есть другой подход, в случае, если вы действительно хотите просто сделать что-то с исполняемыми файлами - и не обязательно заставить заставить фильтр фильтровать себя:

Я предпочитаю это, потому что он не полагается на -executable , который является специфичным для платформы; и он не полагается на -perm , который является немного тайным, специфичным для бит-платформы и, как написано выше, требует, чтобы файл исполнялся для всех (а не только для вас).

-type f важен, потому что в каталогах * nix должны быть исполняемыми, чтобы быть обходимыми, и чем больше запросов находится в команде find , тем больше память будет эффективной вашей командой.

Во всяком случае, просто предлагая другой подход, поскольку * nix - это земля в миллиард подходов.

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

Вот что я использую:

Как вентилятор одного лайнера .

Использование «xargs» для вывода результата из команды find (с помощью print0 для правильной обработки имен файлов с пробелами). Теперь у нас есть список исполняемых файлов, и мы предоставляем их один за другим в качестве параметра для команды «файл». Затем grep для выражения ASCII для игнорирования двоичных файлов. Пожалуйста, замените -executable в команде find на какой стиль вы предпочитаете (см. Более ранние ответы) или что работает на вашей «ОС NIX

Мне нужно было найти файлы с eval в скриптах, принадлежащих root, поэтому создано следующее, чтобы помочь найти недостатки в личной эскалации, когда пользователь root запускает скрипты с небезопасными параметрами .

Данная статья будет полезна для начинающих пользователей и позволит работать с серверами быстрее и удобнее, даже если вы раньше не пользовались Linux.

  • создавать файлы и папки
  • перемещать и копировать файлы и папки
  • узнаете о ссылках
  • сможете легко переносить файлы на сервер, с него и между серверами.



Примеры продемонстрированы на VPS от Infobox и на облачных VPS.

Для работы с сервером подключитесь к нему по SSH.

Как узнать абсолютный путь к директории?

Для того, чтобы узнать абсолютный путь к папке, где вы находитесь, используйте команду:



Как перейти в нужную директорию?

Для того, чтобы перейти в нужную директорию, используется команда:
, где вместо <директория> нужно подставить путь к ней.
Путь может быть абсолютным или относительным.

Абсолютный путь

Абсолютный путь всегда начинается от корня файловой системы /.
Например, для того, чтобы перейти по абсолютному пути с помощью команды cd в папку /var/logs используйте команду:

Относительный путь
  • . — означает текущую директорию
  • .. — означает директорию выше этой по иерархии.

Мы сказали «перейди в директорию, лежащую выше этой по иерархии».

Давайте теперь перейдем в директорию root:

Это означает «перейди в директорию root, которая находится в директории, в которой мы сейчас находимся».
То же самое можно сделать, используя обозначение текущей директории:

Из любого места мы можем перейти в домашнюю директорию, используя команду:

Как просмотреть содержимое директории?

Для просмотра списка файлов и папок в директории воспользуйтесь командой:

  • ls -l – показать дополнительно список прав, размеры файлов, дату изменения и владельца;
  • ls -a – показать все, включая скрытые файлы;
  • ls -la – показать все, включая скрытые файлы, список прав, размеры файлов, дату изменения и владельцев;

Можно просмотреть дерево директорий с помощью команды:

В Debian и Ubuntu это можно сделать с помощью команды:

В CentOS и Oracle Linux:


Результат работы tree выглядит так:


Сколько свободного и занятого места?

Для того, чтобы узнать, сколько занятого и свободного места на диске, воспользуйтесь командой:



Как мы видим, объем диска 20 гигабайт, занято 2.9 гигабайта, свободно 16 гигабайт.

Для того, чтобы узнать размер директории или файла, воспользуйтесь командой:



Как найти файл или директорию

В этом вам поможет утилита find.

В самом простом случае использoвать ее можно так:

Будет осуществлен поиск файла или директории с именем file начиная от корневой директории /.



Опция -name чувствительна к регистру (различает заглавные и строчные буквы). Если вы не знаете, заглавные или строчные буквы используются в названии искомого файла, воспользуйтесь опцией -iname. С помощью опции -regex или -iregex можно найти что-то соответствующее регулярному выражению.

Команда find с параметром -exec позволяет выполнить команду для всего найденного.

Найдя любой файл с расширением .docx он будет скопирован в директорию /tmp.

Для того, чтобы найти, где располагается бинарный файл программы, исходные тексты и документация воспользуйтесь командой whereis:



Если вам необходимо найти только исполняемые файлы программ, которые указаны в путях переменных окружения, воспользуйтесь командой which:


Как создать директорию?

Для создания директории используйте команду mkdir.

Например, создадим в текущей директории директорию «foo»:

Для создания директорий и поддиректорий используйте команду mkdir -p:



Как удалить файл или директорию?

Для удаления воспользуйтесь командой rm:
rm file1.txt
Чтобы удалить и вложенные файлы и папки, добавьте параметр -r:

Если вы не хотите, чтобы вам был задан вопрос, спрашивающий разрешение на удаление, используйте параметр -f:


Если вы хотите удалить только пустую директорию, вам поможет команда rmdir:

Если директория не пустая, вы получите уведомление и удаление не будет выполнено.

Как переместить или переименовать файл или директорию?

Для перемещения файла или директории используйте команду mv:



Переименование можно представить, как перемещение в ту же директорию с другим именем.
Давайте переименуем директорию suda в tuda:



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



В данном примере мы переместили директорию tuda в директорию /var/www и переименовали в site.

Как скопировать файл или директорию

Скопировать файл можно с помощью команды cp:



Можно скопировать сразу несколько файлов в директорию, указанную в последнем параметре:


Для копирования директорий используйте параметр -r:



Так же вам может пригодиться параметр -u для копирования больших файлов и директорий. С его помощью будет выполняться копирование только если копируемый файл новее, чем существующий.


Создаем ссылки

Есть два типа ссылок: жесткие ссылки и символические ссылки.

Жесткие ссылки

Жесткие ссылки — это указатели на файлы. Всегда существует минимум одна жесткая ссылка на файл. Сам файл находится где-то на жестком диске и у него есть уникальный номер. Имя файла хранится отдельно в файловом индексе (inode). Также в файловом индексе содержится тот же уникальный номер. Файловый индекс — жесткая ссылка на файл. При создании еще одной жесткой ссылки появляется еще одна запись в файловом индексе со ссылкой на файл и тем же номером. Сам файл удалится только если будут удалены все жесткие ссылки на него.
Жесткая ссылка создается командой:

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


Символические ссылки

Символическая ссылка — специальный файл, указывающий на документ в другом месте дисковой иерархии. При удалении такой ссылки файл останется на месте. При удалении исходного файла или перемещении исходного файла ссылка тоже останется на месте, но будет вести на несуществующий адрес.

Создать символическую ссылку можно командой:


Как создать пустой файл

Для этого используйте команду:


Как отредактировать текстовый файл

Редактировать текстовые файлы нужно часто при настройке серверов и не только. В данном разделе мы дадим только вводную информацию. В дальнейшем вы можете изучать редакторы более глубоко.

nano – это простой редактор с графическим интерфейсом.
Для установки на CentOS или Oracle Linux выполните команду:

Для установки на Ubuntu и Debian используйте команду:

Для редактирования файла введите:



Редактировать можно сразу же после открытия редактора. Для сохранения изменений и выхода нажмите ctrl + X (^ в подсказках редактора обозначается, как нажатие на кнопку ctrl).



Будет предложено записать изменения на диск, нажмите Y.



На этом шаге можно изменить имя сохраняемого файла. Если это не требуется, просто нажмите Enter.



Мы видим, что изменения успешно записались в файл.

Если вы захотите научиться работать с текстовыми файлами эффективнее, рекомендуем изучать редакторы vim и emacs, но на начальном этапе знакомства с Linux без них можно обойтись.

Как скопировать файл или директорию по SSH на сервер и обратно

Соединение по SFTP с помощью Filezilla

Вы можете воспользоваться Filezilla и настроить соединение по STFP.
Установите клиент, нажмите кнопку создания нового подключения, как показано на скриншоте ниже:



Создайте новый сайт, укажите ip–адрес сервера, тип подключения SFTP, логин и пароль доступа к серверу и нажмите «Connect» (Соединиться).



Разрешите подключение к серверу в следующем окне.



Теперь соединение успешно установлено, вы можете перемещать данные на сервер и с сервера.


Копирование данных с помощью scp

Этот способ особенно полезен, если вы хотите переносить данные между серверами.

На вашем компьютере запустите терминал или Cygwin в Windows (руководство по установке Cygwin есть в этой статье).

Для копирования файла используйте команду:

Для копирования папки используйте команду:


Встает вопрос, как же указать местоположение на удаленном сервере. Это делается в формате:

Например, давайте скопируем папку на удаленный сервер в папку пользователя (



Или давайте скопируем ее в папку /var/www:

Теперь давайте вернем папку temp из /var/www на наш компьютер:

– папка пользователя на нашем компьютере.

Данный способ удобно использовать и для переноса данных между серверами.

Примечание для тех, кто копирует сайт в директорию веб-сервера

Убедитесь с помощью команды ls -la, что папка с сайтом (например /var/www/html) и сами файлы сайта доступны от пользователя, под которым работает веб-сервер. Для apache чаще всего пользователь: www-data. Если у вас файлы в папке сайта принадлежат пользователю root – сайт скорее всего не будет открываться.



Для изменения прав воспользуйтесь командой:

Файловый менеджер для Linux

Спасибо, что дочитали статью до конца. Напоследок расскажем о графическом файловом менеджере для Linux Midnight Commander или просто mc.

Установка mc в CentOS или Oracle Linux:

Установка mc в Ubuntu или Debian:


Запустить файловый менеджер можно просто командой




Это классический двухпанельный файловый менеджер. Вы можете использовать функциональные кнопки компьютера f1… для операций согласно подсказкам на экране. С его помощью можно редактировать файлы, создавать папки, перемещать и копировать папки и файлы и многое многое другое. Этот менеджер может быть полезен на начальном этапе знакомства с Linux.

Для выхода из mc нажмите F10 и Enter.

Если вы нашли ошибку в статье, считаете, что нужно добавить что-то важное или просто у вас есть вопрос — напишите нам.

Утилита find представляет универсальный и функциональный способ для поиска в Linux. Данная статья является шпаргалкой с описанием и примерами ее использования.

Общий синтаксис

find <где искать> <опции>

<где искать> — путь к корневому каталогу, откуда начинать поиск. Например, find /home/user — искать в соответствующем каталоге. Для текущего каталога нужно использовать точку «.».

<опции> — набор правил, по которым выполнять поиск.

* по умолчанию, поиск рекурсивный. Для поиска в конкретном каталоге можно использовать опцию maxdepth.

Описание опций

Тип объекта поиска. Возможные варианты:

  • f — файл;
  • d — каталог;
  • l — ссылка;
  • p — pipe;
  • s — сокет.

Также доступны логические операторы:

Оператор Описание
-a Логическое И. Объединяем несколько критериев поиска.
-o Логическое ИЛИ. Позволяем команде find выполнить поиск на основе одного из критериев поиска.
-not или ! Логическое НЕ. Инвертирует критерий поиска.

Полный набор актуальных опций можно получить командой man find.

Примеры использования find

Поиск файла по имени

1. Простой поиск по имени:

* в данном примере будет выполнен поиск файла с именем file.txt по всей файловой системе, начинающейся с корня /.

2. Поиск файла по части имени:

* данной командой будет выполнен поиск всех папок или файлов в корневой директории /, заканчивающихся на .tmp

3. Несколько условий.

а) Логическое И. Например, файлы, которые начинаются на sess_ и заканчиваются на cd:

б) Логическое ИЛИ. Например, файлы, которые начинаются на sess_ или заканчиваются на cd:

в) Более компактный вид имеют регулярные выражения, например:

* где в первом поиске применяется выражение, аналогичное примеру а), а во втором — б).

4. Найти все файлы, кроме .log:

* в данном примере мы воспользовались логическим оператором !.

Поиск по дате

1. Поиск файлов, которые менялись определенное количество дней назад:

find . -type f -mtime +60

* данная команда найдет файлы, которые менялись более 60 дней назад.

2. Поиск файлов с помощью newer. Данная опция доступна с версии 4.3.3 (посмотреть можно командой find --version).

а) дате изменения:

find . -type f -newermt "2019-11-02 00:00"

* покажет все файлы, которые менялись, начиная с 02.11.2019 00:00.

find . -type f -newermt 2019-10-31 ! -newermt 2019-11-02

* найдет все файлы, которые менялись в промежутке между 31.10.2019 и 01.11.2019 (включительно).

б) дате обращения:

find . -type f -newerat 2019-10-08

* все файлы, к которым обращались с 08.10.2019.

find . -type f -newerat 2019-10-01 ! -newerat 2019-11-01

* все файлы, к которым обращались в октябре.

в) дате создания:

find . -type f -newerct 2019-09-07

* все файлы, созданные с 07 сентября 2019 года.

find . -type f -newerct 2019-09-07 ! -newerct "2019-09-09 07:50:00"

* файлы, созданные с 07.09.2019 00:00:00 по 09.09.2019 07:50

По типу

Искать в текущей директории и всех ее подпапках только файлы:

* f — искать только файлы.

Поиск по правам доступа

1. Ищем все справами на чтение и запись:

find / -perm 0666

2. Находим файлы, доступ к которым имеет только владелец:

find / -perm 0600

Поиск файла по содержимому

find / -type f -exec grep -i -H "content" <> \;

* в данном примере выполнен рекурсивный поиск всех файлов в директории / и выведен список тех, в которых содержится строка content.

С сортировкой по дате модификации

* команда найдет все файлы в каталоге /data, добавит к имени дату модификации и отсортирует данные по имени. В итоге получаем, что файлы будут идти в порядке их изменения.

Лимит на количество выводимых результатов

Самый распространенный пример — вывести один файл, который последний раз был модифицирован. Берем пример с сортировкой и добавляем следующее:

Поиск с действием (exec)

1. Найти только файлы, которые начинаются на sess_ и удалить их:

find . -name "sess_*" -type f -print -exec rm <> \;

* -print использовать не обязательно, но он покажет все, что будет удаляться, поэтому данную опцию удобно использовать, когда команда выполняется вручную.

2. Переименовать найденные файлы:

find . -name "sess_*" -type f -exec mv <> new_name \;

3. Вывести на экран количество найденных файлов и папок, которые заканчиваются на .tmp:

find . -name "*.tmp" | wc -l

4. Изменить права:

find /home/user/* -type d -exec chmod 2700 <> \;

* в данном примере мы ищем все каталоги (type d) в директории /home/user и ставим для них права 2700.

5. Передать найденные файлы конвееру (pipe):

* в данном примере мы использовали find для поиска строки test в файлах, которые находятся в каталоге /etc, и название которых заканчивается на .conf. Для этого мы передали список найденных файлов команде grep, которая уже и выполнила поиск по содержимому данных файлов.

6. Произвести замену в файлах с помощью команды sed:

find /opt/project -type f -exec sed -i -e "s/test/production/g" <> \;

* находим все файлы в каталоге /opt/project и меняем их содержимое с test на production.

Чистка по расписанию

Команду find удобно использовать для автоматического удаления устаревших файлов.

Открываем на редактирование задания cron:

0 0 * * * /bin/find /tmp -mtime +14 -exec rm <> \;

* в данном примере мы удаляем все файлы и папки из каталога /tmp, которые старше 14 дней. Задание запускается каждый день в 00:00.
* полный путь к исполняемому файлу find смотрим командой which find — в разных UNIX системах он может располагаться в разных местах.

Читайте также: