Команда find Linux

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

Введение

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

Переместить определённые файлы но не директории

Переместить файлы начинающиеся на определённые символы в другую директорию, но не трогать директории с подобными названиями

find -maxdepth 1 -type f -name 'sub*' -exec mv {} subprocess \;

-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*"

find + sed

К результатам команды find можно сразу же применить sed

find . -type f -name '*.php' -exec sed -i 's@python/old_file_name\.php@python/new_directory/new_name\.php@' {} \;

. означает, что ищем в текущей директории (и вложенных)

Эта команда заменяет везде

python/old_file_name.php

на

python/new_directory/new_name.php

Следующий пример

find . -type f -name '*.php' -exec sed -n '/\/i\/aws\/oauth.php/ p' {} \;

Эта команда ищет по всем .php файлам строку /i/aws/oauth.php

Если нужно не найти или заменить строку а показать название файла, в котором есть определённые символы - удобно воспользоваться связкой find + grep

Добавить в функцию my_function дополнительный аргумент - сразу в всех .php файлах.

find -type f -name "*.php" -exec sed 's/my_function(\$old_arg1,\ \$old_arg2)/my_function(\$old_arg1,\ \$old_arg2,\ \$new_arg1/' {} \;

find -type f -name "*.php" -exec sed 's/my\_function(\$old\_arg1,\ \$old\_arg2)/my\_function(\$old\_arg1,\ \$old\_arg2,\ \$new\_arg1/' {} \;

find + grep

К результатам команды find можно сразу же применить grep

find . -type f -name '*.php' -exec grep -l '/dvps/aws/oauth.php' {} \;

Эта команда ищет по всем .php файлам строку /i/aws/oauth.php и показывает в каком файле встречается эта строка

xargs

Вместо exec часто бывает эффективнее использовать команду xargs

find . -type f -name '*.php' | xargs grep -l '/dvps/aws/oauth.php'

Чтобы найти все файлы, которые не содержат определённую строку можно также испольовать xargs и grep -L

find -type f | xargs grep -L "text"

tree grep/

grep/ ├── a ├── b ├── c └── d 0 directories, 4 files

cat a b c d

www.beget.com www.heihei.ru www.topbicyle.ru www.aredel.com

find . -type f | xargs grep -L ".com"

./b ./c

find . -type f -name '*.php' ! -name '*RelatedArticles.php' ! -name '*_inc.php' -not -path './.php/*' | xargs grep -L "og_im age" {} \;

Похожие статьи
Linux
FAQ
Debian
Ubuntu
CentOS
Rocky
Bash
Настройка сети
Файлы, директории, ссылки…
Изучить свободное место на диске
Объединить .pdf файлы
diff: сравнение файлов
find: поиск файлов
wget: скачивание файлов
kill: завершить процесс
curl
make
signal: системные сигналы
env: переменные окружения
localectl: язык
systemctl: Список активных сервисов
Firewall
SCP: обмен файлами;
SSH: удалённый доступ
cron: задания по расписанию
sudo
Мониторинг ресурсов
C
C++

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

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

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

@aofeed

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

@aofeedchat

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