Главные темы ► linux ► shell ► find ► Использование find Linux
Теги: shell find maxdepth depth mtime mmin exec xargs

Использование find Linux

find - это мощный инструмент для поиска файлов по различным критериям.

    find

    Синтаксис:
    find [папка] [параметры] критерий шаблон [действие]
    или
    find где_искать опции название

    Основные параметры и критерии команды find

    -P - не открывать символические ссылки
    -L - информацию о файлах по симлинку
    -maxdepth - глубина поиска в каталогах, по умолчанию поиск рекурсивный
    -depth - искать в самом глубоком каталоге
    -mount искать файлы только в этой файловой системе
    -print - выводить полные имена файлов
    -type f - искать только файлы
    -type d - поиск только каталогов
    -name - поиск по имени
    -perm - поиск по режиму доступа
    -user - поиск по владельцу
    -group - поиск по группе
    -mtime - поиск по времени модификации, указывается в днях
    -mmin - поиск по времени модификации в минутах
    -atime - поиск файлов по дате последнего чтения ( обращения к файлу )
    -amin - поиск по дате последнего чтения в минутах
    -ctime - последнее изменение владельца и прав в днях
    -cmin - последнее изменение владельца и прав в минутах
    -user - поиск по владельцу
    -group - поиск по группе
    -perm - поиск по определенных правам доступа
    -empty - искать пустые каталоги
    -prune - исключать из поиска перечисленные каталоги
    -nogroup - поиск файлов, не принадлежащих ни одной группе
    -nouser - поиск файлов без владельцев
    -newer - найти файлы новее чем указанный
    -size - поиск по размеру
    -delete - удалить найденное
    -ls - вывод как ls
    -print - показать найденное
    -print0 - путь к найденным файлам
    -exec - выполнить команду над найденным файлом -exec команда {} \;
    -ok - выдать запрос перед выполнением exec

    #Показать все файлы ( каталоги в том числе ) в текущем каталоге find . -maxdepth 1 #Найти файлы которые не соответствуют шаблону find . -maxdepth 1 -not -name "folder*" #Поиск файла по началу имени find ./ -iname "copy*" #Поиск файла, который начинается на 'copy' и заканчивается расширением '.txt' find ./ -iname "copy*" -a -name "*.txt" #Поиск файлов, которые начинаются на 'copy' или заканчиваются расширением '.txt' find ./ -iname "copy*" -o -name "*.txt" #Поиск файлов, которые не начинаются на 'copy' и имеют расширение txt find ./ -not -iname "copy*" -a -name "*.txt" #Найти только файлы find ./ -type f -iname "copy*" #Искать сразу в двух каталогах find ./Загрузки/ ./Документы/ -type f -iname "linux*" #Поиск скрытых файлов или директорий в текущем каталоге find . -maxdepth 1 -type f -name ".*" #Поиск пустых файлов и папок find /tmp -type f -empty find /tmp -type d -empty #Найти файлы, которые изменялись 60 дней назад find ./ -maxdepth 1 -type f -mtime +60 #Файлы которые изменялись в течении последних 20 мин find bash_scripts/ -mmin -20 -type f #Файлы которые изменялись 20 мин назад, не позже find bash_scripts/ -mmin +20 -type f #Файлы которые изменялись в течении двух дней, 20 минут назад find bash_scripts/ -mtime -2 -mmin +20 -type f #Файлы которые изменились начиная с указанной даты find bash_scripts/ -type f -newermt "2023-01-02 00:00" #Файлы которые изменились между двумя датами, не учитывая последнюю дату find bash_scripts/ -type f -newermt "2023-01-01 00:00" ! -newermt "2023-01-02 00:00" #Файлы к которым обращались начиная с указанной даты find bash_scripts/ -type f -newerat "2023-01-02 00:00" #Файлы которые были созданы 1 января find bash_scripts/ -type f -newerct "2023-01-01 00:00" ! -newerct "2023-01-02 00:01" #Поиск по правам доступа find / -perm 0765 #Поиск файла, владелец которого имеет флаг Suid, можно использовать других пользователей, только чтение и запись, чередовать с отрицанием find /usr -type f -perm /u=s #Файлы принадлежащие определенному пользователю или группе find . -user sergiy find /var/www -group www #Файлы размер которых 50 М find / -size 50M #Файлы размер которых от 50 до 100 М find / -size +50M -size -100M #Действия над найденными файлами find . -empty -exec ls -ld {} \; #Удалить найденные файлы find /tmp -type f -name "*.txt" -exec rm -f {} \; #Удалить файлы больше 100М find /home/bob/dir -type f -name *.log -size +100M -exec rm -f {} \; #Поиск по содержимому find / -type f -exec grep -i -H "content" {} \; #Сортировка по дате модификации find /data -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r #Самый последний модифицированный файл find /data -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r | head -n 1 #Переименовать найденные файлы find . -name "sess_*" -type f -exec mv {} new_name \; find . -name "sess_*" -type f | xargs -I '{}' mv {} new_name #Переместить найденные файлы find . -name "sess_*" -type f -exec mv {} /new/path/ \; #Изменить права для найденных файлов find /home/user/* -type d -exec chmod 2700 {} \; #Сделать замену в найденном файле find /opt/project -type f -exec sed -i -e "s/test/production/g" {} \;
    Примечание

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


    Операторы

    -a - логическое И
    -o - логическое ИЛИ
    -not или ! - логическое НЕ

    pathname

    {}\; - полное имя файла, используется с командами, например find

    sudo find ./ -iname test.sql -exec ls -la {} \;
    find, xargs, exec

    #!/bin/bash BACKUPFILE=backup archive=${1:-$BACKUPFILE} # tar cvf - `find .. -mtime -1 -type f -print` > $archive.tar #Способ 2 find . -mtime -1 -type f -print0 | xargs -0 tar rvf "$archive.tar" #Способ 3 find . -mtime -1 -type f -exec tar rvf "$archive.tar" '{}' \; #Разбор #найти файлы, которые изменялись за последние сутки #архивировать их в архив #Дефис в оболочке Linux обычно означает, что входные данные будут приниматься из stdin, а не из именованного файла. #print выводит результат в стандартный вывод #print0 разделяет имена файлов байтом 0 ( null ), чтобы имена содержащие пробелы или символы перевода строки были правильно интерретированы #-exec выполняет команду для каждого найденого файла #xargs выполняет команду для каждой найденной строки #Если xargs запускается с параметром -0 , он будет ожидать строки, разделенные нулем, в качестве выходных данных с помощью find ... -print0 #Преимущество xargs в том, что он может группировать строки вместе, так что он выполняет команду только один или два раза вместо n раз #Пример 1 #find directory -name '*.txt' -exec ls -l {} + #Пример 2 #find directory -name '*.txt' | xargs ls -l #Для полезного чтения статьи по теме: #https://shapeshed.com/unix-find/ #https://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/ exit 0 #Пример, удалить все файлы в каталоге, к которым не было обращений в течении последних 5 дней find ./ -type f -atime +5 -exec rm {} \; #Поиск всех строк с ip-адресами в /etc sudo find /etc -exec grep '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' {} \;

    Для каждого найденного файла выполняется COMMAND, командная строка должна завершаться последовательностью \;, где сивол ";" экранирован слэшем
    Если COMMAND содержит {}, то find подставляет полное имя найденного файла вместо "{}"


    Источники
    Последнее изменение: October 7, 2024 15:12


    Редактировать


    test

    2025-12-31 23:09:00 Редактировать

    test

    2025-12-31 23:10:00 Редактировать

    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ
    Loading…
    Loading the web debug toolbar…
    Attempt #