Прокачиваемся в find
Поиск файлов и каталогов через cli бывает гораздо более эффективен и гибок, нежели чем через GUI файловых менеджеров.
Команда find, как и grep, используется супер часто в командной строке. Она рекурсивно выводит пути к найденным файлам, спускаясь вглубь по иерархии.
Утилита имеет такой синтаксис:
find каталог параметры действие
Параметры - дополнительные опции, например, глубина поиска, фильтр по имени и т.д;
Действие - что будет выполнено с результатами поиска;
По синтаксису выше найдем пустые каталоги в tmp:
$ find /tmp -type d -empty -print
Детально ознакомиться с параметрами и прочей петрушкой можете по
ссылке.
Поиск по типу файла
Флаг "-type" позволяет искать файлы по типу, среди которых:
1) f – простые файлы;
2) d – каталоги;
3) l – символические ссылки;
4) b – блочные устройства (dev);
5) c – символьные устройства (dev);
6) p – именованные каналы;
7) s – сокеты;
Перечисляем только каталоги:
$ find . -type d
.
./.ssh
./.cache
Поиск по размеру файла
Флаг "-size" позволяет произвести фильтрацию по размеру.
Выведем все файлы более 1 Гб (+1G):
$ find . -size +1G
./android-studio-ide-183.5692245-mac.dmg
"+" — поиск файлов больше заданного размера;
"-" — поиск файлов меньше заданного размера;
Отсутствие знака — поиск по полному совпадению с заданным размером;
Единицы измерения файлов: c (байт), k (Кбайт), M (Мбайт), G (Гбайт).
Поиск пустых файлов и каталогов
Параметр "-empty" позволяет найти пустые ресурсы:
$ find . -type d -empty
./datafiles
Не учитывать регистр при поиске
Если опция "-name" чувствительна к регистру, то "-iname" наоборот:
$ find . -name "new*"
./new test file
./newFile
$ find . -iname "new*"
./NewFile
./new test file
./newFile
Несколько каталогов
Для поиска по нескольким каталогам просто используем перечисление:
find ./dir1 ./dir2 -type f -name "*.c"
Поиск по правам доступа
Команда нам позволяет искать ресурсы по определенной маске прав, например, 0664:
$ find . -type f -perm 0664
Вместо числового представления маски можно использовать символьное для: u (user) g (group) и o (other).
Выполним поиск файлов доступных владельцу для чтения/записи:
$ find /etc -perm /u=rw
Чтобы немного въехать в суть прав доступа, можно просмотреть вот этот
пост.
Ограничение глубины поиска
Если нам нужно указать максимальную глубину поиска, используем "-maxdepth".
Следующий запуск find пройдется только по самому верхнему уровню указанного каталога:
$ find /etc -maxdepth 1
Операторы
Для инвертирования шаблона либо объединения можно применять операторы: and, or, not.
Флаг "-and" обычно можно опустить, т.к. он ставится по дефолту.
Найдем файлы, которые не соответствуют шаблону:
$ find . -not -name "test*"
Либо найдем все файлы, начинающиеся на "test", но без расширения "php":
$ find . -name "test" -not -name "*.php"
Можем также объединить несколько условий и найти ресурсы, которые принадлежат "xoadmin" и имеют размер "< 100 байт":
$ find . -user xoadmin -and -size -100c -type f
Если нужно учесть принадлежность к еще какому-нибудь пользователю, используем "or":
$ find . \( -user xoadmin -or -user vasya \) -and -size -100c -type f
Действия
К команде можно добавить действия, которые будут выполнены с результатами поиска:
1) -delete: удаляет результаты поиска;
$ find . -empty -delete
2) -ls: выводит доп информацию;
3) -print: показывает полный путь к найденным файлам (стоит по умолчанию);
4) -exec: выполняет указанную команду для найденных ресурсов;
$ find . -empty -exec rm -rf {} +
Тут мы удаляем все пустые файлы и каталоги одним вызовом "rm -rf".
Можем через exec найти файлы и прочитать их:
$ find . -type f -exec cat {} \;
Вместо {} подставляется путь к файлу. Если команда оканчивается на "\;", значит она будет выполнена для каждой строки с результатом.
LinuxCamp | #utils