Как найти запускаемый файл в linux

Tip of the hat to @gniourf_gniourf for clearing up a fundamental misconception.

This answer attempts to provide an overview of the existing answers and to discuss their subtleties and relative merits as well as to provide background information, especially with respect to portability.

Finding files that are executable can refer to two distinct use cases:

  • user-centric: find files that are executable by the current user.
  • file-centric: find files that have (one or more) executable permission bits set.

Note that in either scenario it may make sense to use find -L ... instead of just find ... in order to also find symlinks to executables.

Note that the simplest file-centric case – looking for executables with the executable permissions bit set for ALL three security principals (user, group, other) – will typically, but not necessarily yield the same results as the user-centric scenario – and it’s important to understand the difference.

User-centric (-executable)

  • The accepted answer commendably recommends -executable, IF GNU find is available.

    • GNU find comes with most Linux distros
      • By contrast, BSD-based platforms, including macOS, come with BSD find, which is less powerful.
    • As the scenario demands, -executable matches only files the current user can execute (there are edge cases.[1]).
  • The BSD find alternative offered by the accepted answer (-perm +111) answers a different, file-centric question (as the answer itself states).

    • Using just -perm to answer the user-centric question is impossible, because what is needed is to relate the file’s user and group identity to the current user’s, whereas -perm can only test the file’s permissions.
      Using only POSIX find features, the question cannot be answered without involving external utilities.
    • Thus, the best -perm can do (by itself) is an approximation of -executable. Perhaps a closer approximation than -perm +111 is -perm -111, so as to find files that have the executable bit set for ALL security principals (user, group, other) – this strikes me as the typical real-world scenario. As a bonus, it also happens to be POSIX-compliant (use find -L to include symlinks, see farther below for an explanation):

      find . -type f -perm -111  # or: find . -type f -perm -a=x
      
  • gniourf_gniourf’s answer provides a true, portable equivalent of -executable, using -exec test -x {} ;, albeit at the expense of performance.

    • Combining -exec test -x {} ; with -perm +111 (i.e., files with at least one executable bit set) may help performance in that exec needn’t be invoked for every file (the following uses the POSIX-compliant equivalent of BSD find -perm +111 / GNU find -perm /111; see farther below for an explanation):

      find . -type f ( -perm -u=x -o -perm -g=x -o -perm -o=x ) -exec test -x {} ; -print
      

File-centric (-perm)

  • To answer file-centric questions, it is sufficient to use the POSIX-compliant -perm primary (known as a test in GNU find terminology).
    • -perm allows you to test for any file permissions, not just executability.
    • Permissions are specified as either octal or symbolic modes. Octal modes are octal numbers (e.g., 111), whereas symbolic modes are strings (e.g., a=x).
    • Symbolic modes identify the security principals as u (user), g (group) and o (other), or a to refer to all three. Permissions are expressed as x for executable, for instance, and assigned to principals using operators =, + and -; for a full discussion, including of octal modes, see the POSIX spec for the chmod utility.
    • In the context of find:
      • Prefixing a mode with - (e.g., -ug=x) means: match files that have all the permissions specified (but matching files may have additional permissions).
      • Having NO prefix (e.g. 755) means: match files that have this full, exact set of permissions.
      • Caveat: Both GNU find and BSD find implement an additional, nonstandard prefix with are-ANY-of-the-specified-permission-bits-set logic, but do so with incompatible syntax:
        • BSD find: +
        • GNU find: / [2]
      • Therefore, avoid these extensions, if your code must be portable.
  • The examples below demonstrate portable answers to various file-centric questions.

File-centric command examples

Note:

  • The following examples are POSIX-compliant, meaning they should work in any POSIX-compatible implementation, including GNU find and BSD find; specifically, this requires:
    • NOT using nonstandard mode prefixes + or /.
    • Using the POSIX forms of the logical-operator primaries:
      • ! for NOT (GNU find and BSD find also allow -not); note that ! is used in the examples so as to protect ! from shell history expansions
      • -a for AND (GNU find and BSD find also allow -and)
      • -o for OR (GNU find and BSD find also allow -or)
  • The examples use symbolic modes, because they’re easier to read and remember.
    • With mode prefix -, the = and + operators can be used interchangeably
      (e.g., -u=x is equivalent to -u+x – unless you apply -x later, but there’s no point in doing that).
    • Use , to join partial modes; AND logic is implied; e.g., -u=x,g=x means that both the user and the group executable bit must be set.
    • Modes cannot themselves express negative matching in the sense of “match only if this bit is NOT set”; you must use a separate -perm expression with the NOT primary, !.
  • Note that find’s primaries (such as -print, or -perm; also known as actions and tests in GNU find) are implicitly joined with -a (logical AND), and that -o and possibly parentheses (escaped as ( and ) for the shell) are needed to implement OR logic.
  • find -L ... instead of just find ... is used in order to also match symlinks to executables
    • -L instructs find to evaluate the targets of symlinks instead of the symlinks themselves; therefore, without -L, -type f would ignore symlinks altogether.
# Match files that have ALL executable bits set - for ALL 3 security
# principals (u (user), g (group), o (others)) and are therefore executable
# by *anyone*.
# This is the typical case, and applies to executables in _system_ locations
# (e.g., /bin) and user-installed executables in _shared_ locations
# (e.g., /usr/local/bin), for instance. 
find -L . -type f -perm -a=x  # -a=x is the same as -ugo=x

# The POSIX-compliant equivalent of `-perm +111` from the accepted answer:
# Match files that have ANY executable bit set.
# Note the need to group the permission tests using parentheses.
find -L . -type f ( -perm -u=x -o -perm -g=x -o -perm -o=x )

# A somewhat contrived example to demonstrate the use of a multi-principial
# mode (comma-separated clauses) and negation:
# Match files that have _both_ the user and group executable bit set, while
# also _not_ having the other executable bit set.
find -L . -type f -perm -u=x,g=x  ! -perm -o=x

[1] Description of -executable from man find as of GNU find 4.4.2:

Matches files which are executable and directories which are searchable (in a file name resolution sense). This takes into account access
control lists and other permissions artefacts which the -perm test ignores. This test makes use of the access(2) system call, and so can be
fooled by NFS servers which do UID mapping (or root-squashing), since many systems implement access(2) in the client’s kernel and so cannot
make use of the UID mapping information held on the server. Because this test is based only on the result of the access(2) system call, there
is no guarantee that a file for which this test succeeds can actually be executed.

[2] GNU find versions older than 4.5.12 also allowed prefix +, but this was first deprecated and eventually removed, because combining + with symbolic modes yields likely yields unexpected results due to being interpreted as an exact permissions mask. If you (a) run on a version before 4.5.12 and (b) restrict yourself to octal modes only, you could get away with using + with both GNU find and BSD find, but it’s not a good idea.

Время на прочтение
5 мин

Количество просмотров 123K

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

Команда find – это невероятно мощный инструмент, позволяющий искать файлы не только по названию, но и по:

  • Дате добавления.
  • Содержимому.
  • Регулярным выражениям.

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

  • Управления дисковым пространством.
  • Бэкапа.
  • Различных операций с файлами.

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

Синтаксис команды find:

$ find directory-to-search criteria action

Где:

  • directory-to-search (каталог поиска) – это отправной каталог, с которой find начинает поиск файлов по всем подкаталогам, которые находятся внутри. Если не указать путь, тогда поиск начнется в текущем каталоге;
  • criteria (критерий) – критерий, по которым нужно искать файлы;
  • action (действие) – что делать с каждым найденным файлом, соответствующим критериям.

Поиск по имени

Следующая команда ищет файл s.txt в текущем каталоге:

$ find . -name "s.txt"
./s.txt

Где:

  • . (точка) – файл относится к нынешнему каталогу
  • -name – критерии по которым осуществляется поиск. В данном случае поиск по названию файла.

В данном случае критерий -name учитывает только символы нижнего регистра и файл S.txt не появиться в результатах поиска. Чтобы убрать чувствительность к регистру необходимо использовать –iname.

$ find . -iname "s.txt"
./s.txt
./S.txt

Для поиска всех изображений c расширением .png нужно использовать шаблон подстановки *.png:

$ find . -name "*.png"
./babutafb.png
./babutafacebook.png
./Moodle2.png
./moodle.png
./moodle/moodle1.png
./genxfacebook.png

Можно использовать название каталога для поиска. Например, чтобы с помощью команды find найти все png изображения в каталоге home:

$ find /home -name "*.png"
find: `/home/babuta/.ssh': Permission denied
/home/vagrant/Moodle2.png
/home/vagrant/moodle.png
/home/tisha/hello.png
find: `/home/tisha/testfiles': Permission denied
find: `/home/tisha/data': Permission denied
/home/tisha/water.png
find: `/home/tisha/.cache': Permission denied

Если выдает слишком много ошибок в отказе разрешения, тогда можно добавить в конец команды – 2> /dev/null. Таким образом сообщения об ошибках будут перенаправляться по пути dev/null, что обеспечит более чистую выдачу.

find /home -name "*.jpg" 2>/dev/null
/home/vagrant/Moodle2.jpg
/home/vagrant/moodle.jpg
/home/tisha/hello.jpg
/home/tisha/water.jpg

Поиск по типу файла

Критерий -type позволяет искать файлы по типу, которые бывают следующих видов:

  • f – простые файлы;
  • d – каталоги;
  • l – символические ссылки;
  • b – блочные устройства (dev);
  • c – символьные устройства (dev);
  • p – именованные каналы;
  • s – сокеты;

Например, указав критерий -type d будут перечислены только каталоги:

$ find . -type d
.
./.ssh
./.cache
./moodle

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

Допустим, что вам необходимо найти все большие файлы. Для таких ситуаций подойдет критерий -size.

  • “+” — Поиск файлов больше заданного размера
  • “-” — Поиск файлов меньше заданного размера
  • Отсутствие знака означает, что размер файлов в поиске должен полностью совпадать.

В данном случае поиск выведет все файлы более 1 Гб (+1G).

$ find . -size +1G
./Microsoft_Office_16.29.19090802_Installer.pkg
./android-studio-ide-183.5692245-mac.dmg

Единицы измерения файлов:

  • c — Байт
  • k — Кбайт
  • M — Мбайт
  • G — Гбайт

Поиск пустых файлов и каталогов

Критерий -empty позволяет найти пустые файлы и каталоги.

$ find . -empty
./.cloud-locale-test.skip
./datafiles
./b.txt
...
./.cache/motd.legal-displayed

Поиск времени изменения

Критерий -cmin позволяет искать файлы и каталоги по времени изменения. Для поиска всех файлов, измененных за последний час (менее 60 мин), нужно использовать -60:

$ find . -cmin -60
.
./a.txt
./datafiles

Таким образом можно найти все файлы в текущем каталоге, которые были созданы или изменены в течение часа (менее 60 минут).

Для поиска файлов, которые наоборот были изменены в любое время кроме последнего часа необходимо использовать +60.

$ find . -cmin +60

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

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

$ find . -atime +180

Таким образом можно найти файлы, к которым не обращались последние полгода (180 дней).

Поиск по имени пользователя

Опция –user username дает возможность поиска всех файлов и каталогов, принадлежащих конкретному пользователю:

$ find /home -user tisha 2>/dev/null

Таким образом можно найти все файлы пользователя tisha в каталоге home, а 2>/dev/null сделает выдачу чистой без ошибок в отказе доступа.

Поиск по набору разрешений

Критерий -perm – ищет файлы по определенному набору разрешений.

$ find /home -perm 777

Поиск файлов с разрешениями 777.

Операторы

Для объединения нескольких критериев в одну команду поиска можно применять операторы:

  • -and
  • -or
  • -not

Например, чтобы найти файлы размером более 1 Гбайта пользователя tisha необходимо ввести следующую команду:

$ find /home  -user tisha  -and  -size +1G  2>/dev/null

Если файлы могут принадлежать не только пользователю tisha, но и пользователю pokeristo, а также быть размером более 1 Гбайта.

$ find /home ( -user pokeristo -or -user tisha )  -and  -size +1G  2>/dev/null

Перед скобками нужно поставить обратный слеш “”.

Действия

К команде find можно добавить действия, которые будут произведены с результатами поиска.

  • -delete — Удаляет соответствующие результатам поиска файлы
  • -ls — Вывод более подробных результатов поиска с:
    • Размерами файлов.
    • Количеством inode.
  • -print Стоит по умолчанию, если не указать другое действие. Показывает полный путь к найденным файлам.
  • -exec Выполняет указанную команду в каждой строке результатов поиска.

-delete

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

$ find . -empty -delete

Перед удалением лучше лишний раз себя подстраховать. Для этого можно запустить команду с действием по умолчанию -print.

-exec:

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

-exec command {} ;

Где:

  • command – это команда, которую вы желаете выполнить для результатов поиска. Например:
    • rm
    • mv
    • cp
  • {} – является результатами поиска.
  • ; — Команда заканчивается точкой с запятой после обратного слеша.

С помощью –exec можно написать альтернативу команде –delete и применить ее к результатам поиска:

$ find . -empty -exec rm {} ;

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

$ find . -name "*.jpg" -exec cp {} /backups/fotos ;

Таким образом можно скопировать все .jpg изображения в каталог backups/fotos

Заключение

Команду find можно использовать для поиска:

  • Файлов по имени.
  • Дате последнего доступа.
  • Дате последнего изменения.
  • Имени пользователя (владельца файла).
  • Имени группы.
  • Размеру.
  • Разрешению.
  • Другим критериям.

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

  • Удаление.
  • Копирование.
  • Перемещение в другой каталог.

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

image

Содержание

  1. Как получить полный путь к исполняемому файлу?
  2. Поиск в Linux с помощью команды find
  3. Общий синтаксис
  4. Описание опций
  5. Примеры использования find
  6. Поиск файла по имени
  7. Поиск по дате
  8. По типу
  9. Поиск по правам доступа
  10. Поиск файла по содержимому
  11. С сортировкой по дате модификации
  12. Лимит на количество выводимых результатов
  13. Поиск с действием (exec)
  14. Чистка по расписанию
  15. Куда устанавливаются программы в Ubuntu
  16. Куда устанавливаются программы в Ubuntu
  17. ИТ База знаний
  18. Полезно
  19. Навигация
  20. Серверные решения
  21. Телефония
  22. Корпоративные сети
  23. Поиск и расположение команд в Linux
  24. Узнать путь к директории программы

Как получить полный путь к исполняемому файлу?

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

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

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

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

92972: 1379966089

124497:2097198998

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

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

92972: 1379966089

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

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

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

92972: 1379966089

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

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

92972: 1379966089

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

19403: 497797533

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

Я о том, что если «программы» могут лежать только в заранее заданной директории, то ты внутри скрипта можещь написать типа blabla /mydetermineddir/$1 [another params]

45855: 581501832

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

86912:2087359229

86912:2087359229

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

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

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

19403: 497797533

86912:2087359229

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

86912:2087359229

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

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

86912:2087359229

Надо было с mv, ты прав
pet / # mv /usr/bin/wine /usr/bin/wine_
pet / # env PATH=«$:/1» which wine
/1/wine

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

86912:2087359229

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

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

Каталог надо было вперёд ставить.
pet / # mv /usr/bin/wine_ /usr/bin/wine
pet / # ls /usr/bin/wine
/usr/bin/wine
pet / # env PATH=«/1:$» which wine
/1/wine

86912:2087359229

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

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

19403: 497797533

86912:2087359229

pet / # cat /1/bzzz.sh
#! /bin/bash

pet / # env PATH=/1 /bin/bash bzzz.sh
/
/1/bzzz.sh: line 4: dirname: команда не найдена

pet / # env PATH=/1:$ bash bzzz.sh
/
.

pet / # bzzz.sh
bash: bzzz.sh: команда не найдена

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

86912:2087359229

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

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

24775:300429343

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

86912:2087359229

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

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

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

PS: тему твою удалили про разум. ИМХО нет, чёткого критерия не будет.

Источник

Поиск в 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 системах он может располагаться в разных местах.

Источник

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

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

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

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

Большинство программ, устанавливаемых с помощью стандартного пакетного менеджера распределяются по файловой системе в эти папки. Вам, наверное, интересно, как система определяет какие файлы куда копировать. Она и не определяет, это задает разработчик во время сборки пакета. Попробуйте открыть 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:

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

Источник

ИТ База знаний

Полезно

— Онлайн генератор устойчивых паролей

— Онлайн калькулятор подсетей

— Руководство администратора FreePBX на русском языке

— Руководство администратора Cisco UCM/CME на русском языке

— Руководство администратора по Linux/Unix

Навигация

Серверные решения

Телефония

FreePBX и Asterisk

Настройка программных телефонов

Корпоративные сети

Протоколы и стандарты

Поиск и расположение команд в Linux

В статье пойдет речь о расположении файлов и папок, как использовать поиск для нахождения нужной информации. Задача ознакомление с предназначение основных папок в операционной системе Linux и то, что в них находиться.

Онлайн курс по Linux

Мы собрали концентрат самых востребованных знаний, которые позволят тебе начать карьеру администратора Linux, расширить текущие знания и сделать уверенный шаг к DevOps

laptop

1

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

Подробнее про структуру FHS можно прочитать здесь

Вторая часть не менее важная, как же найти в данных папках необходимую информацию.

Команды, используемые для поиска:

2

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

3

Данная команда отрабатывает практически мгновенно. Команда find искала именно по синтаксису, плюс можно добавлять сложные конструкции поиска. Команда locate делает проще показывает все где находится сочетание символов.

4

5

6

7

8

Показывает, где лежит и к какому пакету относится.

Источник

Узнать путь к директории программы

Пишу программу на Си под Линухом. Нужно, чтобы файл, который создает программа, сохранялся не в одной с ней директорией, а во вложенной папке. То есть если прога (а именно исполняемый файл) лежит в /prog, то файл должен сохраниться в prog/file.

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

Я видел способы сделать это для других языков и для Win, но вот конкретно для Си и Линуха не нашел. Помогите, люди добрые.

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

tickКак узнать количество папок в директории?
Вот нашел в интернете такие команды: Данная команда, рекурсивно подсчитает количество файлов.

Как узнать атрибуты файлов и папок директории?
Здравствуйте! Знаю, как вывести с помощью функций diropen, readdir, closedir и scandir содержимое.

Как узнать путь к директории приложения
Имеется форма, на которой есть кнопка с картинкой на заднем фоне. При событии наведения на неё.

tickУзнать путь к файлу в директории приложения
Здравствуйте, мне необходимо узнать в программе путь к папке где находится программа и сохранить.

Источник

Опция Описание
-name Поиск по имени.
-iname Регистронезависимый поиск по имени.
-type

Обновлено Обновлено: 01.02.2022
Опубликовано Опубликовано: 25.07.2016

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

Синтаксис
Примеры
    Поиск по имени
    По дате
    По типу файла
    По правам
    По содержимому
    С сортировкой по дате изменения
    Лимиты
    Действия над найденными объектами
Запуск по расписанию в CRON

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

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

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

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

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

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

Опция Описание
-name Поиск по имени.
-iname Регистронезависимый поиск по имени.
-type

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

  • f — файл;
  • d — каталог;
  • l — ссылка;
  • p — pipe;
  • s — сокет.
-size Размер объекта. Задается в блоках по 512 байт или просто в байтах (с символом «c»).
-mtime Время изменения файла. Указывается в днях.
-mmin Время изменения в минутах.
-atime Время последнего обращения к объекту в днях.
-amin Время последнего обращения в минутах.
-ctime Последнее изменение владельца или прав на объект в днях.
-cmin Последнее изменение владельца или прав в минутах.
-user Поиск по владельцу.
-group По группе.
-perm С определенными правами доступа.
-depth Поиск должен начаться не с корня, а с самого глубоко вложенного каталога.
-maxdepth Максимальная глубина поиска по каталогам. -maxdepth 0 — поиск только в текущем каталоге. По умолчанию, поиск рекурсивный.
-prune Исключение перечисленных каталогов.
-mount Не переходить в другие файловые системы.
-regex По имени с регулярным выражением.
-regextype <тип> Тип регулярного выражения.
-L или -follow Показывает содержимое символьных ссылок (симлинк).
-empty Искать пустые каталоги.
-delete Удалить найденное.
-ls Вывод как ls -dgils
-print Показать найденное.
-print0 Путь к найденным объектам.
-exec <команда> {} ; Выполнить команду над найденным.
-ok Выдать запрос перед выполнением -exec.

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

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

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

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

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

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

find / -name “file.txt”

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

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

find / -name “*.tmp”

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

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

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

find . -name “sess_*” -a -name “*cd”

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

find . -name “sess_*” -o -name “*cd”

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

find . -regex ‘.*/(sess_.*cd)’

find . -regex ‘.*/(sess_.*|.*cd)’

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

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

find . ! -name “*.log”

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

Поиск по дате

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

find . -type f -mtime +60

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

Или в промужутке:

find . -mmin -20 -mmin +10 -type f

* найти все файлы, которые менялись более 10 минут, но не более 20-и.

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

По типу

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

find . -type f

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

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

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

find / -perm 0666

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

find / -perm 0600

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

find / -type f -exec grep -i -H “content” {} ;

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

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

find /data -type f -printf ‘%TY-%Tm-%Td %TT %pn’ | sort -r

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

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

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

find /data -type f -printf ‘%TY-%Tm-%Td %TT %pn’ | sort -r | head -n 1

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

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

find . -name “sess_*” -type f -print -exec rm {} ;

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

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

find . -name “sess_*” -type f -exec mv {} new_name ;

или:

find . -name “sess_*” -type f | xargs -I ‘{}’ mv {} new_name

3. Переместить найденные файлы:

find . -name “sess_*” -type f -exec mv {} /new/path/ ;

* в данном примере мы переместим все найденные файлы в каталог /new/path/.

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

find . -name “*.tmp” | wc -l

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

find /home/user/* -type d -exec chmod 2700 {} ;

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

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

find /etc -name ‘*.conf’ -follow -type f -exec cat {} ; | grep ‘test’

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

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

find /opt/project -type f -exec sed -i -e “s/test/production/g” {} ;

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

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

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

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

crontab -e

И добавляем:

0 0 * * * /bin/find /tmp -mtime +14 -exec rm {} ;

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

Ищем файлы в Linux

Рассказываем, о том, как можно найти файл в Linux.

Ищем файлы через терминал

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

Вот основные опции, которые можно изменить, дополнив команду find:

  1. -name — название. Тут все очевидно. Если знаете точное название файла, то можно использовать этот аргумент и быстро добраться до искомого. Стоит отметить, что к имени относятся отдельные буквы — даже расширение файла по ним отдельно можно искать.
  2. -size — размер. Аргумент на тот случай, если хотите почистить чересчур большие файлы, занимающие много пространства в системе, или просто выяснить, сколько их на компьютере.
  3. -perm — права доступа. Поиск файлов, которые защищены конкретными правами доступа и требующие определенных привилегий для работы с ними.
  4. -user — пользователь. Эта опция нужна, если название файла неизвестно или вам нужно отобразить сразу несколько файлов, которые относятся к конкретному пользователю (он их создал, например, или загрузил в систему).
  5. -group — группа. Поиск файлов, которые относятся к определенной группе пользователей (например, если есть файлы, которые может редактировать и запускать только ряд пользователей системы).
  6. -mtime — поиск по времени, когда файл в последний раз изменяли. Аргумент на случай, если нужно отобразить список файлов, которые были изменены недавно.
  7. -type — тип. Поиск файлов определенного типа. Например, если вам нужны только папки или ссылки.

Также вы сами устанавливаете локацию поиска. Сразу после команды find нужно указать область системы, в которой нужно разыскать файл.

  • Можно указать директорию полностью. Например: /Downloads/Files.
  • Или искать в корневой директории и во всех вложенных в нее: /.
  • Можно искать в папке, где пользователь находится прямо сейчас: ./.
  • Ну и в домашней директории: ~.

Ищем по названию файла

Как я уже написал раньше, за название файла в Linux принимается все от первой буквы имени до расширения. Поэтому существует сразу несколько вариантов поиска по названию. Разберем их на нескольких примерах:

Используем для поиска имя

Начнем с поиска по конкретному названию. Команда для поиска файла с именем «hello» в домашней папке будет выглядеть так: find ~ -name «hello*» -print.

Вот такой простой синтаксис. Наглядно
Вот такой простой синтаксис. Наглядно

Тут стоит обратить внимание сразу на несколько деталей. Во-первых, название файла всегда пишется в двойных кавычках. По-другому поиск не заработает. Во-вторых, символ * (звездочка) сразу после названия файла. Она обозначается, что нужно искать только эту часть текста. Все, что идет дальше (расширение, например) будет игнорироваться. В-третьих, мы пишем __-print__в конце, чтобы вывести результат поиска в терминал и посмотреть, что за файлы мы нашли.

А вот и результаты поиска, полученные благодаря -print.
А вот и результаты поиска, полученные благодаря -print.

При этом вы можете указать при поиске название файла и расширение сразу. Это удобно, если у вас на компьютере есть несколько файлов с одинаковым названием, но разным расширением.

Так выглядит поиск конкретного файла
Так выглядит поиск конкретного файла

Используем для поиска расширение или часть имени

Теперь перейдем к поиску файла по расширению. Команда для поиска скриптов в формате .js в папке Downloads будет выглядеть так: find ~/Downloads/ -name «*js» -print.

Ставим звездочку перед расширением, чтобы исключить все лишнее из поисковой выдачи
Ставим звездочку перед расширением, чтобы исключить все лишнее из поисковой выдачи
Теперь в поисковой выдаче несколько файлов с одинаковым расширением
Теперь в поисковой выдаче несколько файлов с одинаковым расширением

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

Для примера покажу две команды:

  1. find ~/Downloads/ -name «[h]*» — print. Эта ищет все файлы, название которых начинается с буквы h.
  2. find ~/Downloads/ -name «[t]*» -print. А эта ищет файлы c расширением .js ,название которых начинается с буквы h.
Вот результаты поиска по букве
Вот результаты поиска по букве
Результаты поиска по букве и расширению
Результаты поиска по букве и расширению

Ищем по правам доступа

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

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

Например, для поиска в домашней папке всех файлов, которые защищены привилегиями с кодом 775, можно воспользоваться такой командной: find ~ -perm 775 -print.

Поиск по пользователю

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

Например, вот так можно найти файл, принадлежащий пользователю parallels в папке Downloads: sudo find ~/Downloads -user parallels -print.

Вот как эта команда выглядит в терминале
Вот как эта команда выглядит в терминале

В результатах оказались все мои файлы и сама папка Downloads из домашней директории.

Поиск по группе

Более опытные пользователи Linux в курсе, что владельцем файлов и папок может быть не только конкретный человек, но и группа. Соответственно, можно искать все файлы, которые принадлежат отдельной группе. Работает это почти так же, как и в случае с пользователями, только опция другая — -group.

В итоге, чтобы найти в системе все файлы, принадлежащие участникам группы test, воспользуемся такой командой: find / -group test -print. Естественно, название выбрано для примера, и у вас вместо test может быть какое-то другое имя.

Ищем по типу файла

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

Например:

  • f — обычный тип. Это любой файл, который хранится на компьютере. При этом он состоит из блоков.
  • d — каталог. Это файлы-таблицы, содержащие некие ссылки на обычные файлы для иерархической организации. Звучит сложно? Это папки.
  • b — блочный тип. Это специальные файлы, которые ассоциируются с внешними магнитными дисками, где данные переносятся только кусками заданного размера.
  • с — символьный тип. Еще один специальный файл, который ассоциируется со всеми сущностями удаленного контроля типа терминалов.
  • p — именованный канал. Это очень сложная структура межпроцессного взаимодействия. В двух словах не описать.
  • l — ссылка. Это не совсем файл. Точнее, файл, конечно, но не содержащий в себе каких-то полезных данных. Ссылка — это путь до настоящего файла.
  • s — сокет. Это механизм взаимодействия между другими файлами и программами.

Символы перед каждым типом файлов указаны не просто так. Именно их мы будем использовать для поиска. Вот как может выглядеть команда для поиска обычного файла: find / -type f -print.

Как видите, количество файлов избыточное. Это говорит о том, что если мы хотим сыскать что-то конкретно, то фильтры надо настраивать более тонко
Как видите, количество файлов избыточное. Это говорит о том, что если мы хотим сыскать что-то конкретно, то фильтры надо настраивать более тонко

Собственно, мы задействовали саму команду поиска, указали в качестве локации поиска корневую директорию системы, использовали опцию -type для фильтрации результатов по типу и затем ввели сам тип f. Следуя такой же логике, можно указать другой символ (из перечисленных выше) и запустить поиск по другому типу.

Ищем по размеру файла

Файлы можно отфильтровать и отсортировать по размеру. Конечно, для точечного поиска эта опция вряд ли подойдет. Сами посудите, размер скольких файлов в системе вы вообще помните? Тем не менее, если вы по какой-то причине знаете точный размер, то его можно использовать в качестве фильтра для поиска. Например, чтобы найти в папке Downloads найти файл размером 100 мегабайт, нужно ввести find /home/имя пользователя/Downloads -size 100M -print.

Иногда вывод этой команды занимает весьма приличное время на полное отображение. Да и то помещается в терминал не полностью
Иногда вывод этой команды занимает весьма приличное время на полное отображение. Да и то помещается в терминал не полностью

Куда полезнее эта опция будет в том случае, если вам нужно отфильтровать файлы по размеру, а не сыскать что-то конкретное. Допустим, у вас на компьютере лежит массивный список тяжелых файлов, которые отнимают значимый объем пространства, а вы хотите провести некий аудит и чистку, чтобы это пространство хотя бы немного освободить. Например, для того чтобы найти все файлы в компьютере, которые весят больше 5 гигабайт, можно воспользоваться такой командой: find / -size +5000M -print.

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

Поиск по дате изменения файла

По названию этой опции понятно, что она ищет те файлы, которые редактировались за какой-то период времени. В частности, речь идет о количество дней от даты поиска (то есть момент, когда мы вводим команду). Например, если надо в домашней папке найти файлы и папки, которые подвергались каким-либо изменениям в последние 10 дней, то нужно ввести в терминал команду find ~ -mtime –10 -print

Другие команды для поиска

grep

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

Но если воспользоваться опцией -r, а в качестве локации поиска задать путь до папки, то grep разыщет файлы с указанным ранее названием.

Вот так, например: sudo grep -r «hello.js» ~.

whereis

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

Ищем файлы, используя графический интерфейс

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

Поиск через меню оболочки

В Gnome 3 поиск прячется в меню Activities.

  • Кликаем по строчке Activities в верхнем левом углу над панелью избранных программ.
В последней версии Gnome это меню всегда закреплено в левой части панели инструментов
В последней версии Gnome это меню всегда закреплено в левой части панели инструментов
  • Затем нажимаем на поисковое поле, расположенное по центру в верхней части интерфейса.
Вот встроенный в систему поисковик
Вот встроенный в систему поисковик
  • Вводим поисковой запрос.
Как видите, Ubuntu ищет не только по локальным ресурсам, но и в интернете. Это делает его отчасти полезнее поиска в терминале
Как видите, Ubuntu ищет не только по локальным ресурсам, но и в интернете. Это делает его отчасти полезнее поиска в терминале
  • Кликаем по найденному файлу, чтобы он тут же открылся.
Файл открывается в подходящей программе, а не в файловом менеджере
Файл открывается в подходящей программе, а не в файловом менеджере

Если манипуляции мышкой вам чужды (вы же все-таки пользователь Linux), то можно обойтись и без нее. Для включения меню Activities нажмите на клавиатуре клавишу Win (Cmd на клавиатурах Apple). Чтобы начать поиск, просто начните вводить свой запрос (ничего выделять не нужно). А для выбора файла из выдачи просто нажмите на клавишу «Ввод» (Enter).

Ищем через файловый менеджер

  • Открываем любой файловый менеджер (в моем примере будет стандартный Nautilus). См. также: лучшие файловые менеджеры для Linux.
У вас может быть любой другой файловым менеджер
У вас может быть любой другой файловым менеджер
  • Ищем там кнопку включения поиска. Обычно она похожа на лупу. Это общепризнанный символ.
Иногда поле поиска отображается в виде строки
Иногда поле поиска отображается в виде строки
  • Вводим свой поисковой запрос и выбираем нужный объект.
Имеем схожий результат
Имеем схожий результат

Итак, мы рассмотрели с вами все способы поиска файлов в Linux-системах. А если вы только собираетесь познакомиться с этой ОС – рекомендуем изучить популярные дистрибутивы Linux и выбрать самый подходящий.

Автор материала: Владимир Ковылов

Ищем файлы в Linux

Подписывайтесь на наш канал и ставьте лайки! А еще можете посетить наш официальный сайт.

Добавить комментарий