15 супер полезных примеров команды find в Linux / Хабр

15 супер полезных примеров команды find в Linux / Хабр Вклады Сбербанк
Содержание
  1. Что такое текущая рабочая директория
  2. 1.10.    Опция Опция -depth
  3. 1.12.    Поиск файлов с последующей архивацией командой cpio
  4. 1.2. Опция -perm
  5. 1.7. Опция -newer
  6. 2.    Команда xargs
  7. -delete
  8. Дальнейшая работа с результатами команды find: exec и xargs
  9. Действия над файлами
  10. И это далеко не все возможности команды find…
  11. Исключение папки из поиска
  12. Использование find и exec
  13. Использование команды xargs
  14. Как найти текущую рабочую директорию
  15. Команда find в linux
  16. Команда pwd
  17. Операторы
  18. Опции
  19. Отключение рекурсивного поиска для поиска только в текущей папке
  20. Поиск без учёта регистра
  21. Поиск крупных и мелких файлов (поиск по размеру файла)
  22. Поиск недавно изменённых файлов (поиск по времени изменения или создания)
  23. Поиск нескольких файлов с несколькими расширениями (или условием)
  24. Поиск по времени доступа
  25. Поиск по набору разрешений
  26. Поиск по размеру файла
  27. Поиск пустых файлов и каталогов
  28. Поиск пустых файлов и папок
  29. Поиск только файлов или только папок
  30. Поиск файлов в заданной папке
  31. Поиск файлов в нескольких папках
  32. Поиск файлов и папок по имени
  33. Поиск файлов по владельцу
  34. Поиск файлов по расширению (важно)
  35. Примеры использования команды find с использованием действий
  36. Примеры использования команды find с использованием критериев
  37. Примеры использования команды find с использованием операторов
  38. Синтаксис команды find
  39. Сочетание команд find и grep
  40. 3.    Заключение

Что такое текущая рабочая директория

Текущая рабочая директория — директория, в которой пользователь работает в данный момент. При взаимодействии с командной строкой вы всегда находитесь внутри директории.

По умолчанию, когда вы запускаете операционную систему Linux, текущим рабочим каталогом является домашняя директория. Изменить рабочую директорию можно с помощью команды cd.

Например, чтобы изменить текущую рабочую директорию на /tmp, используйте такую команду:

cd /tmp

Путь к текущей рабочей директории может отображаться в оболочке командной строки.

1.10.    Опция Опция -depth

Опция -depth позволяет организовать поиск таким образом, что сначала проверяются все файлы текущего каталога (и рекурсивно все его подкаталоги) и только в конце — запись самого каталога. Эта опция широко применяется при создании списка файлов, помещаемых в архив на магнитной ленте с помощью команды cpio или tar, так как в этом случае сначала записывается на ленту образ каталога и лишь после этого задаются права доступа к нему.

$ find . -name “*” -print -о -name “.*” -print -depth

Вот как могут выглядеть результаты ее работы:

./.Xdefaults ./.bash_logout ./.bash_profile ./.bashrc ./.bash_nistory ./file ./Dir/filel ./Dir/file2 ./Dir/file3 ./Dir/Subdir/file4 ./Dir/Subdir ./Dir

1.12.    Поиск файлов с последующей архивацией командой cpio

Команда cpio применяется главным образом для записи файлов на магнитную ленту и чтения их с ленты. Очень часто она используется совместно с командой find, по каналу принимая от нее список файлов.

Вот как выполняется запись на магнитную ленту содержимого каталогов /etc, /home и /apps:

$ cd /$ find etc home appa -depth -print | cpio -ov > dev/rmtO

Опция -о команды cpio задает режим записи файлов на ленту. Опция -v (verbose — словесный режим) является указанием команде cpio сообщать о каждом обрабатываемом файле.

Обратите внимание на то, что в именах каталогов отсутствует начальный символ ‘/’. Таким образом задаются относительные путевые имена архивируемых каталогов, что при последующем чтении файлов из архива позволит воссоздавать их в любой части операционной системы, а не только в корневом каталоге.

1.2. Опция -perm

Опция -perm позволяет находить файлы с заданным режимом доступа. Например, для поиска файлов с режимом доступа 755 (их может просматривать и выполнять любой пользователь, но только владелец имеет право осуществлять запись) следует воспользоваться такой командой:

$ find . -perm 755 -print

Если перед значением режима вставить дефис, будет произведен поиск файлов, для которых установлены все указанные биты разрешений, остальные биты при этом игнорируются. Например, следующая команда ищет файлы, к которым другие пользователи имеют полный доступ:

$ find . -perm -007 -print

Если же перед значением режима введен знак “плюс”, осуществляется поиск файлов, для которых установлен хотя бы один из указанных битов разрешений, при этом остальные биты игнорируются.

1.7. Опция -newer

Если необходимо найти файлы, доступ к которым осуществлялся в промежутке времени между обновлениями двух заданных файлов, воспользуйтесь опцией -newer. Общий формат ее применения таков:

-newer старый_файл ! -newer новый_файл

Знак ‘!‘ является оператором логического отрицания. Он означает: найти файлы, которые новее, чем старый_файл, но старее, чем новый_файл.

Предположим, у нас есть два файла, которые обновлялись с интервалом немногим более двух дней:

-rwxr-xr-x 1 root    root    92 Apr 18 11:18 age.awk-rwxrwxr-x 1 root    root    1054 Apr 20 19:37 belts.awk

Для нахождения всех файлов, которые обновлялись позже, чем age.awk, но раньше, чем belts.awk, выполните следующую команду (применение опции -exec описано чуть ниже):

$ find . -newer age.awk ! -newer belts.awk -exec Is -1 {} ;-rwxrwxr-x 1 root    root    62 Apr 18 11:32 ./who.awk-rwxrwxr-x 1 root    root    49 Apr 18 12:05 ./group.awk-rw-r—r— 1 root    root    201 Apr 20 19:30 ./grade2.txt-rwxrwxr-x 1 root    root    1054 Apr 20 19:37 ./belts.awk

Но как быть, если необходимо найти файлы, созданные, скажем, в течение последних двух часов, а у вас нет файла, сформированного ровно два часа назад, с которым можно было бы сравнивать? Создайте такой файл! Для этой цели предназначена команда touch -t, которая создает файл с заданной временной меткой в формате ММДЦччмм (месяц-день-часы-минуты). Например:

Читайте также:  МКБ вклады для физических лиц на 2022 год, проценты по вкладам на сегодня в банках Новинок.

2.    Команда xargs

При наличии опции -exec команда find передает указанной команде все найденные файлы, которые обрабатываются за один раз. К сожалению, в некоторых системах длина командной строки ограниченна, поэтому при обработке большого числа файлов может быть выдано сообщение об ошибке, которое обычно гласит:

“Too many arguments” (слишком много аргументов) или “Arguments too long” (слишком большой список аргументов). В этой ситуации на помощь приходит команда xargs. файлы, полученные от команды find, она обрабатывает порциями, а не все сразу.

Рассмотрим пример, в котором команда find возвращает список всех файлов, имеющихся в системе, а команда xargs выполняет для них команду file, проверяющую тип каждого файла:

$ find / -type f -print I xarge.file/etc/protocols: English text /etc/securetty: ASCII text

-delete

Полезен, когда необходимо найти и удалить все пустые файлы, например:

$ find . -empty -delete

Перед удалением лучше лишний раз себя подстраховать. Для этого можно запустить команду с действием по умолчанию -print.

Дальнейшая работа с результатами команды find: exec и xargs

Итак, мы изучили различные способы поиска файлов по заданным параметрам. Это хорошо. А теперь следующий шаг: рассмотрим, какие действия можно выполнять с результатами команды find.

Например, как найти файлы с именем, соответствующим определённому шаблону, и переименовать их за одно действие? Или выявить и удалить пустые файлы?

Вам уже известно, что в Linux можно использовать перенаправление ввода-вывода, чтобы объединить результаты одной команды с вводом другой. Но с результатами команды find это не сработает — по крайней мере, не напрямую.

Чтобы выполнить действия над результатом команды find, есть два варианта:

Действия над файлами

Когда выполняется команда find, вы можете выполнять различные действия над найденными файлами. Рассмотрим основные из них.

В выполняемых командах вы можете использовать параметр {} в качестве аргумента, который заменяется путем к текущему файлу.

И это далеко не все возможности команды find…

Перечислить все опции и примеры использования команды find практически невозможно. Её возможностям нет границ, но если вы освоите её принципы, она окажется очень кстати во многих ситуациях. Решающий фактор — как сочетается логика действия разных опций и команд.

Исключение папки из поиска


Если нет необходимости производить поиск в той или иной папке, можно исключить её с помощью опций path, prune и логического «или».

find . -path "./directory_exclude/*" -prune -o -name SEARCH_NAME

Будьте внимательны: путь к папке должен оканчиваться на *, затем идёт

-prune

и только потом

-o

Попросту говоря, при поиске с опцией prune папка, указанная с помощью path, игнорируется. Prune всегда сопровождается флагом -o (логическое «или»), чтобы папки, которые не были исключены, просматривались на наличие искомого объекта.

Использование find и exec

Допустим, вам нужен подробный список (ls -l) файлов, найденных командой find. Вот как его получить:

find . -type f -name "*.txt" -exec ls -l {}  

Результат будет таким:

abhishek@LHB:~/Examples$ find . -type f -name "*.txt" -exec ls -l {}  
-rw-rw-r-- 1 abhishek abhishek 39 Oct 13 19:30 ./another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir1/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir2/another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:51 ./new/mystuff/new.txt
-rwxrwxrwx 1 abhishek abhishek 35 Oct 13 15:37 ./new/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:16 ./new.txt

Многие забывают ввести

{}

в конце команды exec. Но это необходимо — как и пробел между скобками {} и плюсом .

Фигурные скобки ссылаются на результат выполнения команды find. Их содержимое может иметь следующий вид: {файл 1, файл 2, файл 3}. Символ используется как конец команды exec.

Есть ещё один вариант оформления exec:

find . -type f -name "*.txt" -exec ls -l {} ;

В данном случае плюс заменён на точку с запятой. Дополнительная косая черта означает, что точка с запятой не является специальным символом.

Преимущество сочетания {} заключается в меньшем количестве команд ( ls -l file1 file2 file3), тогда как комбинация {} ; запустит цепочку ls -l file1, ls -l file2 и так далее.

Однако сочетание {} ; даёт возможность использовать {} несколько раз в одном и том же выражении exec. Так, приведённая ниже команда переименует все обнаруженные файлы с расширением .old.

find . -type f -name "*.txt" -exec mv {} {}.old ;

Использование команды xargs


Многие пользователи Linux сталкиваются с необходимостью перенаправления ввода-вывода довольно часто. Но команда exec с цепочкой символов

{}

кажется им слишком сложной.

И тут на помощь приходит xargs. Нужно просто перенаправить вывод команды find в команду xargs через конвейер.

find . -type f -name "*.txt" | xargs ls -l

image

Синтаксис куда проще, верно? К тому же команда xargs тоже весьма эффективна. Подробнее о ней — в статье по ссылке.

Как найти текущую рабочую директорию

Чтобы понять, в какой директории вы работаете в данный момент, введите в терминале pwd. Вывод может выглядеть так (название директории может отличаться):

/home/linuxize

Всё, что делает команда pwd — выводит значение переменной окружения PWD. Такой же вывод получится, если ввести в терминале:

Читайте также:  Выгодные вклады Совкомбанка в рублях в Рубцовске: открыть рублевый депозит в 2022 году

Команда find в linux

Общий синтаксис команды find выглядит так:

find [directory to search] [options] [expression]


Всё, что в квадратных скобках, указывать необязательно. А значит, выполнить команду find можно вообще без опций и параметров. Она выдаст список всех файлов и папок в текущем расположении. Мало полезного, да?

Так что давайте взглянем на параметры подробнее:

Приведу простой пример:

find . -type f -name myfile


Такая команда выполнит поиск файла (именно файла, не папки) с именем

myfile

в текущей папке и подпапках. Опция

-type f

сужает поиск до файлов. Точка (

.

) указывает на текущую папку.

Рассмотрим несколько примеров применения команды find.

Команда pwd

Команда pwd выводит текущую рабочую директорию. Это одна из базовых и самых популярных команд в Linux. При вызове pwd выводится полный путь к текущей рабочей директории.

Команда pwd встроена в большинство современных командных оболочек, в том числе в Bash. Её поведение отличается от выполнения /bin/pwd. С помощью команды type можно получить все места, где есть pwd:

type-apwd

Получаем вывод:

pwd is a shell builtin
pwd is /bin/pwd

Как показывает вывод, встроенная команда pwd имеет более высокий приоритет по сравнению с /bin/pwd. Поэтому она используется всякий раз, когда вы вводите в командую строку pwd. Если вы хотите использовать файл /bin/pwd, нужно указать в командной строке полный путь до него.

Операторы

Для объединения нескольких критериев в одну команду поиска можно применять операторы:

Например, чтобы найти файлы размером более 1 Гбайта пользователя tisha необходимо ввести следующую команду:

Опции

Опции команды find указываются, начиная с символа «-», за которым следует название опции. Рассмотрим основные опции.

Отключение рекурсивного поиска для поиска только в текущей папке

По умолчанию команда find выполняет поиск во всех подпапках текущего расположения. Если это не требуется, можно ограничить глубину поиска значением «1». Так вы ограничитесь поиском в текущей папке, не залезая в подпапки.

find . -maxdepth 1 -type f -name "*.txt"

image

Поиск без учёта регистра

Команда find по умолчанию учитывает регистр. Чтобы выполнить поиск по имени файла без учёта регистра, надо ввести опцию

-iname

вместо

-name

find . -type f -iname SEARCH_NAME


С поиском по папкам (

type -d

) это тоже работает.

abhishek@LHB:~/Examples$ find -iname mystuff
./new/mystuff
./MyStuff
./mystuff

Скриншот последних трёх примеров:

Поиск крупных и мелких файлов (поиск по размеру файла)

Команда find поможет найти крупные или мелкие файлы, если выполнить поиск по размеру. Но это работает только для файлов, не для папок.

Используется опция -size с аргументом N для файлов размером более N и -N для файлов размером менее N.

А вот как можно найти файлы точного заданного размера (50 КБ):

find . -size 50k

Так выполняется поиск файлов размером более 1 ГБ в текущей папке:

find . -size  1G

А так — файлов, не превышающих 20 байт:

find . -size -20c


Для поиска файлов размером более 100 МБ, но менее 2ГБ, введите:

find . -size  100M -size -2G

Поиск по размеру тоже можно сочетать с поиском по имени файла. Таким образом, найти в корневом каталоге все файлы размером более 500 МБ с именем, оканчивающимся на .log, можно так:

find / -size  500M -name "*.log"

Для справки:

Поиск недавно изменённых файлов (поиск по времени изменения или создания)


Вы ведь знакомы с

Вы не раз столкнётесь с ситуацией, когда нужен список всех недавно изменённых файлов. В таких случаях на помощь приходит поиск по времени изменения.

Найти все файлы, претерпевшие изменения за последние трое суток (3*24ч), можно так:

find . -type f -mtime -3

А все файлы, созданные пять и более дней назад, ищутся так:

find . -type f -ctime  5


Понимаю, что 24 часа — большой срок. Что если нужно выявить файлы, изменённые всего пару минут назад? Для этого предусмотрены опции

mminamincmin

Так выглядит команда поиска всех файлов, изменённых за последние пять минут:

find . -type f -mmin -5

image

Можно не только указать имя файла, но и ограничить временной промежуток с двух сторон. Команда ниже выполнит поиск всех файлов .java, изменённых не ранее 30 и не позднее 20 минут назад.

find . -type f -mmin  20 -mmin -30 -name "*.java"

Поиск нескольких файлов с несколькими расширениями (или условием)

Команда, рассмотренная выше, нужна для поиска файлов по расширению. А что если нужно найти файлы с несколькими разными расширениями?

Вместо того чтобы прогонять команду find несколько раз, введите её один раз с опцией -o, которая работает как логическое условие «или»:

find . -type f -name "*.cpp" -o -name "*.txt" 

Например:

abhishek@LHB:~/Examples$ find . -type f -name "*.txt" -o -name "*.cpp"
./new.txt
./file.cpp
./new/new.txt
./new/dir2/another.txt
./new/dir1/new.txt
./another.txt

Поиск по времени доступа

Критерий -atime позволяет искать файлы по времени последнего доступа.

$ find . -atime  180

Таким образом можно найти файлы, к которым не обращались последние полгода (180 дней).

Читайте также:  Вклады на год в Тинькофф Банке 18% 23.03.2022 | Банки.ру

Поиск по набору разрешений

Критерий -perm – ищет файлы по определенному набору разрешений.

$ find /home -perm 777

Поиск файлов с разрешениями 777.

Поиск по размеру файла

Допустим, что вам необходимо найти все большие файлы. Для таких ситуаций подойдет критерий -size.

В данном случае поиск выведет все файлы более 1 Гб ( 1G).

$ find . -size  1G
./Microsoft_Office_16.29.19090802_Installer.pkg
./android-studio-ide-183.5692245-mac.dmg

Поиск пустых файлов и каталогов

Критерий -empty позволяет найти пустые файлы и каталоги.

$ find . -empty
./.cloud-locale-test.skip
./datafiles
./b.txt
...
./.cache/motd.legal-displayed

Поиск пустых файлов и папок

Опция

-empty

позволяет использовать команду find для поиска пустых файлов и папок.

Найти таковые в текущей папке можно следующим образом:

find . -empty

Можно указать тип объектов, чтобы искать только файлы или только папки:

find . -empty -type f

Кроме того, можно в таком режиме искать файлы по имени:

find . -empty -type f -name "*.cpp"

image

Поиск только файлов или только папок

Если нужно искать только файлы, на помощь придёт опция type -f:

find . -type f -name SEARCH_NAME


Тип и имя можно указывать в любом порядке. Возьмём пример выше и ограничим круг поиска файлами:

abhishek@LHB:~/Examples$ find -type f -name mystuff
./mystuff

Если нужно найти папку, укажите тип type -d:

find . -type d -name SEARCH_NAME

Вот пример нашего поиска уже по папкам:

abhishek@LHB:~/Examples$ find -type d -name mystuff
./new/mystuff

Поиск файлов в заданной папке


Все приведённые примеры иллюстрируют поиск в текущей папке, потому что команда включает в себя точку (

.

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

abhishek@LHB:~/Examples$ find ./new -name mystuff
./new/mystuff

Поиск файлов в нескольких папках

Если нужные вам файлы могут находиться в нескольких папках, можно выполнить поиск во всех этих расположениях за один раз. Просто укажите все пути к папкам при введении команды find:

find ./location1 /second/location -type f -name "pattern"

Поиск файлов и папок по имени


Так выполняется поиск файлов и папок по имени:

find . -name SEARCH_NAME

Поскольку тип объекта не указан, команда выполняет поиск и файлов, и папок.

Пример ниже — поиск файлов и папок с именем «mystuff»:

abhishek@LHB:~/Examples$ find -name mystuff
./new/mystuff
./mystuff

Поиск файлов по владельцу


Можно также найти файлы, принадлежащие определённому пользователю.

Вот как обнаружить в текущей папке все файлы пользователя Джона:

Поиск файлов по расширению (важно)

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

Скажем, вы хотите найти все файлы С в текущих папках. Файлы С имеют расширение .cpp, и вот как их можно найти:

find . -type f -name "*.cpp"

С такими опциями команда find найдёт только файлы (

-type f

) с именами, оканчивающимися на

.cpp

Примеры использования команды find с использованием действий

Найти в текущем каталоге обычные файлы размером больше 1000 байт и выполнить над ними команду ls -dils (действие ls).

find . -size  1000c -type f -ls

Найти в текущем каталоге обычные файлы, начинающиеся с символа тильда «~», и для каждого файла выдавать запрос на его удаление (на выполнение команды rm).

find . -name "~*" -type f -ok rm {} ;

Примеры использования команды find с использованием критериев

Найти в текущем каталоге обычные файлы (не каталоги), имя которых начинается с символа «~».

find . -type f -name "~*" -print

Найти в текущем каталоге файлы, измененные позже, чем файл file.bak.

find . -newer file.bak -type f -print

Примеры использования команды find с использованием операторов

Найти в текущем каталоге файлы, начинающиеся с символа «~» или c «temp» и являющиеся именно обычными файлами (-type f), а не каталогами.

find . ( -name "~*" -or -name "temp*" ) -type f -print

Найти в текущем каталоге (не обрабатывая подкаталоги — -maxdeph 1) обычные файлы (-file f) размером больше 600 мегабайт и менее 1 гигабайта (-size) или файлы имя которых заканчивающиется на «.mpeg» (-name).

find . -maxdepth 1 ( ( -size  600M -and -size -1G ) -or -name "*.mpeg" ) -and -type f

Синтаксис команды find

Общий синтаксис команды find, который вы можете найти в справочном руководстве, может показаться не совсем простым, поэтому я приведу более удобный для восприятия:

find [путь] [опции] [критерии поиска] [действия над файлами]

Сочетание команд find и grep


Теперь вы умеете совмещать команду find с xargs и exec, и пора перейти на следующий уровень — объединить find и grep.

Для сисадминов и разработчиков комбинация команд find и grep — одна из самых распространённых и вместе с тем самых полезных.

Команда find находит файлы с именем, соответствующим шаблону, а затем команда grep выполняет поиск по их содержимому.

Например, вам нужно найти все файлы .txt, в которых есть имя «Alice». Объединить команды find и grep можно так:

find . -type f -name "*.txt" -exec grep -i alice {}  


А можно с помощью xargs:

find . -type f -name "*.txt" | xargs grep -i alice

image

Конечно, пример элементарный, но если команда grep вам знакома, можете использовать её на своё усмотрение.

3.    Заключение

Команда find представляет собой прекрасный инструмент поиска различных файлов по самым разнообразным критериям. Благодаря опции -exec, а также команде xargs найденные файлы могут быть обработаны практически любой системной командой.

Оцените статью