Использование find Linux
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 подставляет полное имя найденного файла вместо "{}"
Источники
Связанные темы
Удаление файлов из bash linux с возможностью восстановления
Использование команды tee в Linux
Поиск уязвимостей и следов взлома в Linux
Использование wget и curl в Linux
Команда chattr и lsattr в Linux
Использование awk Linux Alpine
Блокировка пользователя в Linux
Проверка на необходимость перезапуска после обновления пакетов
Стандартные потоки и перенаправление ввода/вывода в Linux
Архивирование и сжатие файлов в Linux
Полезные команды и скрипты Linux
Условная конструкция if в Linux
Использование оператора select в языке shell
Внутренние и внешние команды linux
Использование конструкции case в Linux