Search for files in Linux with find

Contents
Intro
Simple Search
Find and copy to current dir
Find specific type
Depth
Find by Size
Find by start of filename
Find by part of name
Move specific files but not directories
find + sed
find + grep

Introduction

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

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

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

Поиск

Просто найти

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

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

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

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

find -name '*.pdf'

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

find -name '*.pdf' -delete

To найти только файлы определённого типа execute 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

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

To найти обычные файлы нужно использовать -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 \;

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 '/aws/oauth.php' {} \;

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

Share in social media: