Команда find в операционной системе Unix/Linux предназначена для поиска файлов и каталогов в файловой системе на основе различных критериев. Она позволяет пользователям выполнять поиск по имени файла, типу, размеру, времени последнего изменения и другим параметрам. Команда имеет множество опций и аргументов, что делает ее мощным инструментом для эффективного поиска и управления файлами.
Допустим, у нас есть такая структура файлов и папок:
user@vpc /tmp/find_example $ tree
.
├── dir1
│ ├── file1_dir1
│ ├── file2_dir1
│ └── file3_dir1
├── dir2
│ ├── file1_dir2
│ ├── file2_dir2
│ └── file3_dir2
├── dir3
│ └── dir1_dir3
│ └── file1_dir1_dir3
├── file1
├── file2
└── file3
4 directories, 10 files
Ниже буду приведены примеры использования этой команды для различных сценариев:
Поиск всех файлов во всех директориях внутри текущей (опция -type f):
user@vpc /tmp/find_example $ find . -type f
./dir1/file2_dir1
./dir1/file3_dir1
./dir1/file1_dir1
./file3
./file2
./file1
./dir2/file2_dir2
./dir2/file1_dir2
./dir2/file3_dir2
./dir3/dir1_dir3/file1_dir1_dir3
Поиск всех папок внутри текущей директории и внутри нее (опция -type d
для поиска папок, опция -mindepth 1
для игнорирования текущего каталога, чтобы в поиске не выдавалась точка):
user@vpc /tmp/find_example $ find . -mindepth 1 -type d
./dir1
./dir2
./dir3
./dir3/dir1_dir3
Для сравнения без ключа -mindepth 1:
user@vpc /tmp/find_example $ find . -type d
.
./dir1
./dir2
./dir3
./dir3/dir1_dir3
Поиск всех файлов только для текущей директории (опция -maxdepth 1
):
user@vpc /tmp/find_example $ find . -maxdepth 1 -type f
./file3
./file2
./file1
Поиск по нескольким условиям и логическим выражениям с ними (-a, -o, -not
; экранирование \( ... \)
обязательно):
user@vpc /tmp/find_example $ find . -type f \( -name file1 -o -amin -4 \) -a ! -name file3
./file1
./dir3/dir1_dir3/file1_dir1_dir3
Тут мы с помощью скобок говорим, что сперва надо обработать выражение "имя файла file1 ИЛИ к файлу был доступ меньше, чем 4 минуты назад", а затем говорим, что надо искать результат этого выражения И файл с именем НЕ file3
У нас есть 1 файл, который бы открывался меньше 4 минут назад, и есть файл file1.
Поиск с использованием опции -regex " "
(находим все файлы в директориях dir1 или dir2):
user@vpc /tmp/find_example $ find . -type f -regex "./\(dir1\|dir2\)/.*"
./dir1/file2_dir1
./dir1/file3_dir1
./dir1/file1_dir1
./dir2/file2_dir2
./dir2/file1_dir2
./dir2/file3_dir2
Зачастую необходим поиск по дате доступа к файлам или по времени изменения файла (или его атрибутов). В таком случае используются команды -amin
, -atime
, -cmin
, -ctime
.
В качестве практического применения можно, например, искать, были ли изменены файлы конфигурации в папке /etc за последний день:
user@vpc /tmp/find_example $ sudo find /etc/ -type f -ctime -1
/etc/resolv.conf
/etc/sysctl.conf
amin - время последнего доступа (открытия/чтения) к файлу в минутах
atime - тоже самое, только в днях
cmin - время последнего изменения файла или его атрибутов в минутах
ctime - тоже самое, только в днях
Если указываете числовое значение, то происходит поиск точного совпадения (например -amin 5 найдет файлы, к которым доступ осуществлялся точно 5 минут назад).
Если указать перед числом + или -, то поиск будет осуществляться за период (если указать -amin -5, то найдутся файлы, к которым был доступ в последние 5 минут, а если -amin +5, то файла, к которым был доступ больше 5 минут назад).