Команда find Linux

Содержание
Введение
Простой поиск
-name: Поиск по имени
Поиск по расширению
-not: Логическое отрицание
-o: Логическое ИЛИ
Найти и сразу скопировать в текущую директорию
Поиск по типу
Уровни вложенности
Поиск по размеру файла
Поиск по началу имени файла
Поиск по части имени файла
-perm: Поиск по правам доступа
-path: Поиск путей
-prune: Не заходить в директорию
Исключить директорию из поиска

Введение

find это мощный инструмент для работы с файлами.

С его помощью можно задавать различные составные условия для дальнейших действий над файлами.

Часто ипользуется как первый шаг перед копированием, перемещением, удалением, изменением файлов, соответсвующих определённым условиям.

В этой статье вы можете познакомится с основами применения find. Про применение find совместно с grep , sed , xargs и другими утилитами вы можете прочитать в статье «Продвинутые методы работы с find»

Поиск

Найти и вывести на экран все файлы в директории

find
find .
find . -print

-name: Поиск по имени

Найти по полному имени в текущей директории

find . -name 'heihei.log'

./heihei.log

Если регистр не важен

find . -iname 'heihei.log'

./HeiHei.log
./heihei.log

Поиск по расширению

Найти по расширению файла с помощью wildcard *

Ищем в /usr/share/doc все pdf файлы

find /usr/share/doc -name '*.pdf'

-not: обратное условие

Найти в текущей директории все файлы кроме php

find . -not -name '*.php'
find . ! -name '*.php'

Несколько условий вместе

Логическое и

Найти все файлы, которые начинаются с log но не имеют расширения .txt

find . -name "log*" ! -name '*.txt'

-o: Логическое или

Найти либо .html либо .php файлы

find . -name '*.html' -o -name '*.php'

Найти и скопировать

Найти и сразу скопировать в текущую директорию

find /usr/share/doc -name '*.pdf' -exec cp {} . \;

Найти в текущей директории

find -name '*.pdf'

Удалить из текущей директории

find -name '*.pdf' -delete

Поиск по типу

Чтобы найти только файлы определённого типа выполните find с опцией type.

Например, что найти все ссылки в директории /etc

find /etc -type l

Подробнее о файлах в Linux читайте в статье «Типы файлов в Linux»

Уровни вложенности

Найти все ссылки только на верхнем уровне вложенности

find /etc -maxdepth 1 -type l

Поиск по размеру файла

df -h /boot

Filesystem Size Used Avail Use% Mounted on /dev/sda1 1014M 194M 821M 20% /boot

Найти обычные файлы определённого размера

Чтобы найти обычные файлы нужно использовать -type f

find /boot -size +20000k -type f

find: ‘/boot/efi/EFI/centos’: Permission denied find: ‘/boot/grub2’: Permission denied /boot/initramfs-0-rescue-389ee10be1b38d4281b9720fabd80a37.img /boot/initramfs-3.10.0-1160.el7.x86_64.img /boot/initramfs-3.10.0-1160.2.2.el7.x86_64.img

Файлы бывают следующих типов:

- : regular file
d : directory
c : character device file
b : block device file
s : local socket file
p : named pipe
l : symbolic link

Подробности в статье - «Файлы в Linux»

find /boot -size +10000k -type f

find: ‘/boot/efi/EFI/centos’: Permission denied find: ‘/boot/grub2’: Permission denied /boot/initramfs-0-rescue-389ee10be1b38d4281b9720fabd80a37.img /boot/initramfs-3.10.0-1160.el7.x86_64.img /boot/initramfs-3.10.0-1160.el7.x86_64kdump.img /boot/initramfs-3.10.0-1160.2.2.el7.x86_64.img /boot/initramfs-3.10.0-1160.2.2.el7.x86_64kdump.img

То же самое плюс показать размер файлов

find /boot -size +10000k -type f -exec du -h {} \;

find: ‘/boot/efi/EFI/centos’: Permission denied find: ‘/boot/grub2’: Permission denied 60M /boot/initramfs-0-rescue-389ee10be1b38d4281b9720fabd80a37.img 21M /boot/initramfs-3.10.0-1160.el7.x86_64.img 13M /boot/initramfs-3.10.0-1160.el7.x86_64kdump.img 21M /boot/initramfs-3.10.0-1160.2.2.el7.x86_64.img 14M /boot/initramfs-3.10.0-1160.2.2.el7.x86_64kdump.img

Поиск по началу имени файла

Обратите внимание, что в find, в отличие от grep , ставить перед началом названия никаких символов не нужно.

find -name 'topb*'

Поиск по части имени файла

Найти в проекте topbicyle все директории с qa в названии

find topbicycle/ -name '*qa*' -type d

-perm: поиск по правам доступа

find . -type f -perm 0600
find . -type f ! -perm 0600

-path: поиск путей

Если мне нужно посмотреть содержимое директорий /code/php и /code/python

find . -path "./code/p*"

Пример укороченного результата

./code/python ./code/python/paramiko/errors/index.php ./code/python/paramiko/models ./code/python/paramiko/index.php ./code/python/ve ./code/python/ve/index.php ./code/python/datetime.php … ./code/php … ./code/php/mobile_headers.php ./code/php/external_func.php ./code/php/json_decode.php ./code/php/index.php ./code/php/random_int.php ./code/php/check_http_user_agent.php

-prune: ограничить глубину

С помощью path можно посмотреть содержимое всех поддиректорий code на букву p /code/p*

Если нужно посмотреть только поддиректории верхнего уровня - используется -prune

find . -path "./code/p*" -prune

./code/python ./code/php

Получили только поддиректории без их содержимого

Исключить директорию из поиска

Из предыдущего параграфа понятно, что с помощью prune можно исключить директорию из поиска.

Пример: найти в ./code все файлы, заканчивающиеся на index.php но проигнорировать поддиректории на p, то есть в директориях python и php не искать.

find ./code -path "./code/p*" -prune -false -o -name "*index.php"

./code/js/errors/index.php ./code/js/index.php ./code/c/index.php ./code/cpp/index.php ./code/go/pointers/index.php ./code/go/declare_variable/index.php ./code/go/constants/index.php ./code/go/index.php ./code/java/index.php ./code/dotnet/index.php ./code/ruby/index.php ./code/theory/index.php ./code/index.php

-false нужен чтобы не выводить проигнорированные директории.

Ещё один способ исключить директорию из поиска

find ./code -name "*.php" -not -path "./code/p*"

Похожие статьи
Файлы
Linux
Bash
Директории
Ссылки
Изучить свободное место на диске
Объединить файлы
Объединить .pdf файлы
diff: сравнение файлов
find: поиск файлов основы
find: продвинутый поиск файлов
wget: скачивание файлов
rename: переименовать файлы
SCP: обмен файлами;
Архивация/Распаковка
tree: просмотр директорий
convert

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: