Инструменты пользователя

Инструменты сайта


find

Различия

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

Ссылка на это сравнение

find [2018/11/08 15:17] (текущий)
Строка 1: Строка 1:
 +====== shell команда find Линукс ======
 +~~Title: Поиск файлов в Linux изучаем команду find на примерах ~~
 +{{htmlmetatags>​
 +metatag-description=(find — утилита поиска файлов по имени и другим свойствам,​ используемая в UNIX‐подобных операционных системах.)
 +}}
 +
 +  * [[http://​find.unixpin.com/​ru/​|Построитель команды '​find'​]]
 +  * [[Временные метки файла (Access, Modify, Change) в Linux]]
 +
 +Утилита **find** - наиболее эффективное средство поиска и «массовой обработки» файлов. Find - это не столько средство поиска,​ сколько инструмент для обхода файловой иерархии. Вы можете удалять файлы, соответствующие критериям поиска или даже применять к ним любую произвольную команду. Для применения команды служит ключ -exec. По умолчанию,​ find возвращает все файлы после текущего в рабочей директории.
 +====== Список ключей 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).
 +    * -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 — используется,​ когда вы хотите исключить из поиска определённые каталоги.
 +====== Поиск по времени,​ размеру ======
 +Найдем файлы, которые не читали более чем (условие '​более чем'​ задается знаком '​+'​) 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>​
 +  * Перемещает все файлы меньше 1MБ в папку tiny<​file>​
 +$ find /​var/​phoenix/​Images/​ -name “*.jpg” -size -1024k | xargs -i
 +mv {} /​var/​phoenix/​Images/​tiny
 +</​file>​
  
find.txt · Последние изменения: 2018/11/08 15:17 (внешнее изменение)