Команда find Linux
Введение
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*"