Команда find в Linux – мощный инструмент сисадмина


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


    Команда 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

    AlexHost
    AlexHost — надежный хостинг по доступным ценам!

    Похожие публикации

    Комментарии 12

      +3
      А какое отношение эта статья имеет к информационной безопасности?
        –3
        В ходе анализа инцидентов в информационной безопасности, как правило, анализируем большой объем логов и поиск по ним.
        +2
        Переписывание манов это такой способ увеличения энтропии?
          0
          … и довольно толково, хотя и монотонно, рассказал содержание массовой брошюры «Мятеж на „Очакове“»

          А вот вам задачка. Как сделать -exec для двух или более программ.
          Например, find что-то и сделать file и ls -l с найденным.
            0
            :) action может быть несколько, пишутся последовательно один за другим. можно сделать что-то вроде. В данном мануале это опущено почему-то…
            find / -iname someshit -exec ls {} \; -exec rm {} \;
              0
              Нет, так не работает — попробуйте.
                0
                в том то и дело, что проверил — работает:
                find / -iname *.log -exec ls {} \; -exec file {} \;
                  0
                  работает
              0
              спасибо, хороший man ;)
                0
                Только с ошибками и неполный: например, cmin — поиск по заданному времени создания, а не времени изменения (который, на самом деле, mmin и mtime), кроме cmin и atime есть ещё amin, mmin, ctime и mtime (min — в минутах, time — в сутках), которые почему-то не упомянуты и не раскрыта разница между вариантами min и time.

                P.S. Автор, судя по опыту с одной из предыдущих статей, не читает личку
                0
                Еще хороший инструмент: fdupes -rd .
                Ну и конечно: du -Sh | sort -rh | head -20
                А так же
                find. -type f -exec sudo chmod 664 {} \;
                find. -type d -exec sudo chmod 775 {} \;
                  +1

                  Если не указывать аргумент -type, команда find будет искать и файлы, и папки. В первом примере мы можем найти вместо файла s.txt папку с именем s.txt, если она там находится, причём из вывода команды не будет понятно, что именно мы нашли. Либо явно указывать тип при поиске, либо использовать что-то наподобие -ls при выводе.

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое