Различия

Показаны различия между двумя версиями страницы.


Предыдущая версия
find [2025/07/06 12:38] (текущий) – внешнее изменение 127.0.0.1
Строка 1: Строка 1:
 +====== shell команда find Линукс ======
 +~~Title: Поиск файлов в Linux изучаем команду find на примерах ~~
 +{{htmlmetatags>
 +metatag-description=(find — утилита поиска файлов по имени и другим свойствам, используемая в UNIX‐подобных операционных системах.)
 +}}
  
 +Читайте также [[Временные метки файла (Access, Modify, Change) в Linux]]
 +
 +Утилита **find** - наиболее эффективное средство поиска и «массовой обработки» файлов. Find - это не столько средство поиска, сколько инструмент для обхода файловой иерархии. Вы можете удалять файлы, соответствующие критериям поиска или даже применять к ним любую произвольную команду. Для применения команды служит ключ -exec. По умолчанию, find возвращает все файлы после текущего в рабочей директории.
 +
 +**Популярные варианты команды find:**
 +<file bash>
 +find . -type f  | xargs grep -ni 'logon home'
 +</file>Альтернатива рекурсивоное использование [[grep]], в примере поиск производится из текущей директории<file bash>
 +grep -r -i 'logon home' .
 +</file>
 +Рекурсивно во всех файлах заменить имя одного домена на другое
 +<file bash>
 +find /var/www/task42.topadm.in/wp-content/cache/supercache -type f -print0 | xargs -0 sed -i 's/task42\.darkfire\.cf/lastwp\.darkfire\.cf/g'
 +</file>
 +Замена путей для всех файлов в текущей директории, команда пригодится для [[perenos_sajta_na_drugoj_xosting|переноса сайтов]]:
 +<file bash>
 +find . -type f -name '*' -exec sed -i -r 's%что_меняем%на_что_меняем%g' {} \;
 +</file>
 +Обнулить рекурсивно все error.log и вывести список обработанных файлов:
 +<file bash>
 +for k in `find /var/www/ -type f -name error.log`; do echo $k && echo > $k ;done
 +</file>
 +Найти файлы старше 60 минут и удалить их:
 +<file bash>
 +find /var/lib/pg-archive/ -type f -mmin +60 | xargs -I % rm -f %
 +</file>
 +====== Список ключей find ======
 +    * -name — искать по имени файла, при использовании подстановочных образцов параметр заключается в кавычки.<file bash>
 +find . -type f -name '.htaccess' -ls
 +</file>
 +    * -regex - спользование более сложных регулярных выражений. Например, удалить [[Postfix]] email<file bash>
 +find /var/vmail/* -type f -regex ".*\.\(mail\|mail:.*\)" -mtime +30 -delete -print
 +</file>
 +    * -type — тип искомого: f=файл, d=каталог, l=связь (link).
 +<alert type="success"> find  выводит названия директории с точкой (например ./snap). Соответственно, [[rsync#kak_zapustit_rsync_v_neskolko_potokov|например в примере многопоточного rsync]], вы увидите путь такого вида data/www/./example.com/wp-content  Не нужно волноваться, /./ несет смысл текущего каталога, но по сути оно эквивалентно просто /, так как знак точки означает "остаться в текущем каталоге".</alert>
 +    * -user — владелец: имя пользователя или UID. <file bash>
 +find . -user <username>
 +</file>
 +    * -group — владелец: группа пользователя или GID.
 +    * -perm — указываются права доступа.
 +    * -size — размер: указывается в 512-байтных блоках или байтах (признак байтов — символ «c» за числом).
 +    * -atime — время последнего обращения к файлу.
 +    * -ctime — время последнего изменения владельца или прав доступа к файлу.
 +    * -mtime — время последнего изменения файла.
 +    * -newer — искать файлы созданные позже указанной даты. Можно указать конкретный файл. Например найти все файлы в каталоге etc время создания/изменения которых позже даты создания файла now<file bash>
 +find /etc -newer /tmp/now
 +</file>
 +    * -delete — удалять найденные файлы.
 +    * -ls — генерирует вывод как команда ls -dgils.
 +    * -print — показывает на экране найденные файлы.
 +    * -exec command {} \; — выполняет над найденным файлом указанную команду; обратите внимание на синтаксис.
 +    * -ok — перед выполнением команды указанной в -exec, выдаёт запрос.
 +    * -depth — начинать поиск с самых глубоких уровней вложенности, а не с корня каталога.
 +    * -prune — используется, когда вы хотите исключить из поиска определённые каталоги.
 +    * -mmin - предназначена для поиска файлов/каталогов с последним изменением в минутах, например <file bash>
 +Найти файлы старше 2 часов:
 +find . -mmin +120
 +Найдите файлы, которым менее 2 часов:
 +find . -mmin -120
 +</file>
 +====== Поиск по времени, размеру ======
 +Найдем файлы, которые не читали более чем (условие 'более чем' задается знаком '+') 30 дней:<file>
 +find . -atime +30 -print
 +</file>Для поиска файлов, которые вы не модифицировали какое-то время, используйте ключ **-mtime**, а для файлов у которых определенное время назад не менялись права доступа используйте **-ctime**. Число после символа '+' задает количество дней (суток). Для того, что бы узнать какие файлы были модифицированы сегодня, попробуйте:<file>
 +find . -mtime -1 -print
 +</file>Эта команда покажет вам какие файлы были модифицированы за последние сутки. Заметьте, что для указания времени 'меньше чем' следует указать знак '-'.
 +
 +Все три ключа **time** в качестве параметра используют суточные интервалы. Если вы хотите использовать более точные интервалы времени, то вам может помочь ключ **-newer**, который позволяет сравнивать время модификации, последнего чтения или смены прав одного файла с другим с точностью до минуты. Например для того что бы поглядеть какие скрытые (файлы с точкой в начале) были изменены с тех пор как вы последний раз изменили файл .cshrc, вы должны выполнить такую команду:<file>
 +find . -type f -name ".*" -newer .cshrc -print
 +</file>Обратите внимание, что мы включили в эту команду ключ **-type** с параметром '-f', который устанавливает тип искомого 'файл', так как в данном случае нам не нужны изменившиеся каталоги. Ключ **-name** будет искать файлы с именем начинающимся на точку, а ключ **-newer** отберет файлы, которые модифицировались позже файла .cshrc.
 +
 +<note important>По умолчанию подразумевается, что между ключами поиска стоит логический оператор 'И', если вы хотите, что бы вместо 'И' использовался 'ИЛИ', укажите ключ '-o'. Поскольку между ключами по умолчанию подразумевается логический оператор 'И', то выражение find принимает следующий вид: искать файлы определенного типа 'И' с определенным именем 'И' более новые чем мой файл .cshrc.</note>
 +
 +Продемонстрируем разницу между логическим 'И' и логическим 'ИЛИ'. Если я хочу найти все файлы в моем домашнем каталоге, которые не использовались последние 7 дней 'И' их размер больше чем 10Мб, то я использую следующую команду:<file>
 +find . -atime +7 -size +20480 -print
 +</file>Однако, если я хочу найти файлы которые не использовались последнюю неделю 'ИЛИ' их размер больше чем 10Мб, то мне придется выполнить такую команду:<file>
 +find . -atime +7 -o -size +20480 -print
 +</file>Если вы будете использовать ключ '-size', вам придется немного повычислять, так как он использует в качестве параметра число 512-байтных блоков в файле. Я могу воспользоваться командой expr для облегчения этого процесса:<file>
 +find . -atime +7 -o -size +`expr 10 \* 1024 \* 2` -print
 +</file>Заметьте, что в этой команде в обратных кавычках (это знак ` в левом верхнем углу вашей клавиатуры) заключено то что надо вычислить. Нам остается поставить перед выражением знак плюс, так как мы хотим найти файлы 'более чем' 10Мб размера.
 +
 +Для того что бы поглядеть заранее то, что сосчитает команда expr, припишите впереди команды find команду echo:<file>
 +echo find . -atime +7 -o -size +`expr 10 \* 1024 \* 2` -print
 +find . -atime +7 -size +20480 -print
 +</file>Вообще проверка сложного выражения find, для того что бы увидеть его полный вид, перед выполнением, является хорошим тоном.
 +====== Примеры использования ======
 +  * Вывести список файлов во всей файловой системе, чей размер 100 Мб и больше:<code>
 +# find / -size +100M -print
 +</code>
 +  * Вывести список файлов во всей файловой системе, изменённых в течение последней минуты: <code>find / -mmin -1 -print</code>
 +  * Вывести список файлов, которые были изменены в течение последних 24 часов: <code>
 +# find . -mtime -1 -type f -print
 +# find . -mtime -1 -type f -exec ls -l {} \;
 +# find . -mtime -1 -type f -print | wc # находим и командой wc считаем количество
 +# find . -mtime -1 -type f -delete # удаляем эти файлы
 +</code>
 +  * Сменить рекурсивно права на 644 на все файлы начиная с текущей директории: <code bash>$ find . -type f -exec chmod 644 {} \;
 +</code>
 +  * Сменить рекурсивно права на 755 на все директории начиная с текущей директории:<code bash>$ find . -type d -exec chmod 755 {} \;</code>
 +  * Поиск директорий, доступных на запись, относительно текущей:<code>$ find . -perm -2 -type d -ls
 +540771    4 drwxrwxrwx   2 user user     4096 Мар  3 20:49 ./.clamtk/viruses
 +540772    4 drwxrwxrwx   2 user user     4096 Мар  3 20:49 ./.clamtk/history
 +</code>
 +  * Рекурсивно выведет список файлов, имена которых соответствуют указанному шаблону "*.py": <code>$ find ./ -name "*.py"
 +</code>
 +  * Поиск файлов с установленным [[SUID]] -битом<code bash>$ find / -type f -perm -04000 -ls
 +   622   28 -rwsr-xr-x   1 root     root        26228 Янв 28 20:07 /bin/fusermount
 +   113   36 -rwsr-xr-x   1 root     root        34696 Май 12  2009 /bin/ping
 +   114   32 -rwsr-xr-x   1 root     root        30492 Май 12  2009 /bin/ping6
 +   144   48 -rwsr-xr-x   1 root     root        47096 Окт 23 00:54 /bin/umount
 +    91   72 -rwsr-xr-x   1 root     root        72188 Окт 23 00:54 /bin/mount
 +   135   32 -rwsr-xr-x   1 root     root        31124 Июл 31  2009 /bin/su
 +   find: `/etc/cups/ssl': Permission denied
 +   find: `/etc/chatscripts': Permission denied
 +   find: `/etc/ppp/peers': Permission denied
 +   95333    8 -rwsr-x---   1 root     gnokii       5548 Апр 30  2009 /usr/sbin/mgnokiidev
 +</code>чтобы избавится от ошибок Permission denied, команду можно запустить так<code>$ find / -type f -perm -04000 -ls 2>/dev/null</code>то есть сообщения об ошибках (2 – это дескриптор потока STDERR) выбрасываются, остается лишь нормальный вывод STDOUT.
 +  * Все файлы с расширением jpg переносит в директорию Images<file>
 +$ find /var/phoenix/ -name “*.jpg” | xargs -I mv {}/var/phoenix/Images
 +</file>
 +  * Поиск дубликатов файлов:
 +<file bash>
 +find ./ -type f | xargs -d\\n md5sum | sort | uniq -D -w 32 >duplicates.txt
 +</file>
 +  * Перемещает все файлы меньше 1MБ в папку tiny<file>
 +$ find /var/phoenix/Images/ -name “*.jpg” -size -1024k | xargs -i
 +mv {} /var/phoenix/Images/tiny
 +</file>
 +  * Скрипт рекурсивно в файлах ищет строку
 +<file bash>
 +#!/bin/bash
 + 
 +# Скрипт рекурсивно перебирает все файлы начиная с директории запуска.
 +# И ищет в них вхождение переданной строки и выводит на консоль
 +# в запускаемый скрипт нужно передать парметр - строку поиска, например
 +# ./find_xargs.sh ivsenaidu.ru
 + 
 + 
 +FIND="/usr/bin/find"
 +XARGS="/usr/bin/xargs"
 +GREP="/bin/grep"
 + 
 +# Directory search
 +SDIR=`pwd`
 +#SDIR=$0
 +# The search string
 +SSTR=$1
 + 
 +echo Find \'$SSTR\' into \'$SDIR\':;
 + 
 +$FIND $SDIR | $XARGS $GREP -ni "$SSTR"
 +</file>

📌 Удобный подбор VPS по параметрам доступен на DIEGfinder.com - официальном инструменте проекта DIEG. Это часть единой экосистемы, созданной для того, чтобы помочь быстро найти подходящий VPS/VDS сервер для любых задач хостинга.

📌 Для тестирования скриптов, установщиков VPN и Python-ботов рекомендуем использовать надежные VPS на короткий срок. Подробнее о быстрой аренде VPS для экспериментов - читайте здесь.

💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!