- Поиск в Linux с помощью команды find
- Общий синтаксис
- Описание опций
- Примеры использования find
- Поиск файла по имени
- Поиск по дате
- По типу
- Поиск по правам доступа
- Поиск файла по содержимому
- С сортировкой по дате модификации
- Лимит на количество выводимых результатов
- Поиск с действием (exec)
- Чистка по расписанию
- Как использовать regex с командой find?
- 7 ответов
- Regular expressions in grep ( regex ) with examples
- Regular Expressions in grep
- Three types of regex
- grep Regular Expressions Examples
- How to match single characters
- How to match only dot (.)
- Anchors
- How to match sets of character using grep
- How negates matching in sets
- Wildcards
Поиск в Linux с помощью команды find
Утилита find представляет универсальный и функциональный способ для поиска в Linux. Данная статья является шпаргалкой с описанием и примерами ее использования.
Общий синтаксис
— путь к корневому каталогу, откуда начинать поиск. Например, find /home/user — искать в соответствующем каталоге. Для текущего каталога нужно использовать точку «.».
— набор правил, по которым выполнять поиск.
* по умолчанию, поиск рекурсивный. Для поиска в конкретном каталоге можно использовать опцию maxdepth.
Описание опций
Опция | Описание |
---|---|
-name | Поиск по имени. |
-iname | Регистронезависимый поиск по имени. |
-type | |
-size | Размер объекта. Задается в блоках по 512 байт или просто в байтах (с символом «c»). |
-mtime | Время изменения файла. Указывается в днях. |
-mmin | Время изменения в минутах. |
-atime | Время последнего обращения к объекту в днях. |
-amin | Время последнего обращения в минутах. |
-ctime | Последнее изменение владельца или прав на объект в днях. |
-cmin | Последнее изменение владельца или прав в минутах. |
-user | Поиск по владельцу. |
-group | По группе. |
-perm | С определенными правами доступа. |
-depth | Поиск должен начаться не с корня, а с самого глубоко вложенного каталога. |
-maxdepth | Максимальная глубина поиска по каталогам. -maxdepth 0 — поиск только в текущем каталоге. По умолчанию, поиск рекурсивный. |
-prune | Исключение перечисленных каталогов. |
-mount | Не переходить в другие файловые системы. |
-regex | По имени с регулярным выражением. |
-regextype | Тип регулярного выражения. |
-L или -follow | Показывает содержимое символьных ссылок (симлинк). |
-empty | Искать пустые каталоги. |
-delete | Удалить найденное. |
-ls | Вывод как ls -dgils |
Показать найденное. | |
-print0 | Путь к найденным объектам. |
-exec <> \; | Выполнить команду над найденным. |
-ok | Выдать запрос перед выполнением -exec. |
Также доступны логические операторы:
Оператор | Описание |
---|---|
-a | Логическое И. Объединяем несколько критериев поиска. |
-o | Логическое ИЛИ. Позволяем команде find выполнить поиск на основе одного из критериев поиска. |
-not или ! | Логическое НЕ. Инвертирует критерий поиска. |
Полный набор актуальных опций можно получить командой man find.
Примеры использования find
Поиск файла по имени
1. Простой поиск по имени:
find / -name «file.txt»
* в данном примере будет выполнен поиск файла с именем file.txt по всей файловой системе, начинающейся с корня /.
2. Поиск файла по части имени:
* данной командой будет выполнен поиск всех папок или файлов в корневой директории /, заканчивающихся на .tmp
3. Несколько условий.
а) Логическое И. Например, файлы, которые начинаются на sess_ и заканчиваются на cd:
find . -name «sess_*» -a -name «*cd»
б) Логическое ИЛИ. Например, файлы, которые начинаются на sess_ или заканчиваются на cd:
find . -name «sess_*» -o -name «*cd»
в) Более компактный вид имеют регулярные выражения, например:
find . -regex ‘.*/\(sess_.*cd\)’
* где в первом поиске применяется выражение, аналогичное примеру а), а во втором — б).
4. Найти все файлы, кроме .log:
find . ! -name «*.log»
* в данном примере мы воспользовались логическим оператором !.
Поиск по дате
1. Поиск файлов, которые менялись определенное количество дней назад:
find . -type f -mtime +60
* данная команда найдет файлы, которые менялись более 60 дней назад.
2. Поиск файлов с помощью newer. Данная опция доступна с версии 4.3.3 (посмотреть можно командой find —version).
а) дате изменения:
find . -type f -newermt «2019-11-02 00:00»
* покажет все файлы, которые менялись, начиная с 02.11.2019 00:00.
find . -type f -newermt 2019-10-31 ! -newermt 2019-11-02
* найдет все файлы, которые менялись в промежутке между 31.10.2019 и 01.11.2019 (включительно).
б) дате обращения:
find . -type f -newerat 2019-10-08
* все файлы, к которым обращались с 08.10.2019.
find . -type f -newerat 2019-10-01 ! -newerat 2019-11-01
* все файлы, к которым обращались в октябре.
в) дате создания:
find . -type f -newerct 2019-09-07
* все файлы, созданные с 07 сентября 2019 года.
find . -type f -newerct 2019-09-07 ! -newerct «2019-09-09 07:50:00»
* файлы, созданные с 07.09.2019 00:00:00 по 09.09.2019 07:50
По типу
Искать в текущей директории и всех ее подпапках только файлы:
* f — искать только файлы.
Поиск по правам доступа
1. Ищем все справами на чтение и запись:
find / -perm 0666
2. Находим файлы, доступ к которым имеет только владелец:
find / -perm 0600
Поиск файла по содержимому
find / -type f -exec grep -i -H «content» <> \;
* в данном примере выполнен рекурсивный поиск всех файлов в директории / и выведен список тех, в которых содержится строка content.
С сортировкой по дате модификации
find /data -type f -printf ‘%TY-%Tm-%Td %TT %p\n’ | sort -r
* команда найдет все файлы в каталоге /data, добавит к имени дату модификации и отсортирует данные по имени. В итоге получаем, что файлы будут идти в порядке их изменения.
Лимит на количество выводимых результатов
Самый распространенный пример — вывести один файл, который последний раз был модифицирован. Берем пример с сортировкой и добавляем следующее:
find /data -type f -printf ‘%TY-%Tm-%Td %TT %p\n’ | sort -r | head -n 1
Поиск с действием (exec)
1. Найти только файлы, которые начинаются на sess_ и удалить их:
find . -name «sess_*» -type f -print -exec rm <> \;
* -print использовать не обязательно, но он покажет все, что будет удаляться, поэтому данную опцию удобно использовать, когда команда выполняется вручную.
2. Переименовать найденные файлы:
find . -name «sess_*» -type f -exec mv <> new_name \;
find . -name «sess_*» -type f | xargs -I ‘<>‘ mv <> new_name
3. Вывести на экран количество найденных файлов и папок, которые заканчиваются на .tmp:
find . -name «*.tmp» | wc -l
4. Изменить права:
find /home/user/* -type d -exec chmod 2700 <> \;
* в данном примере мы ищем все каталоги (type d) в директории /home/user и ставим для них права 2700.
5. Передать найденные файлы конвееру (pipe):
find /etc -name ‘*.conf’ -follow -type f -exec cat <> \; | grep ‘test’
* в данном примере мы использовали find для поиска строки test в файлах, которые находятся в каталоге /etc, и название которых заканчивается на .conf. Для этого мы передали список найденных файлов команде grep, которая уже и выполнила поиск по содержимому данных файлов.
6. Произвести замену в файлах с помощью команды sed:
find /opt/project -type f -exec sed -i -e «s/test/production/g» <> \;
* находим все файлы в каталоге /opt/project и меняем их содержимое с test на production.
Чистка по расписанию
Команду find удобно использовать для автоматического удаления устаревших файлов.
Открываем на редактирование задания cron:
0 0 * * * /bin/find /tmp -mtime +14 -exec rm <> \;
* в данном примере мы удаляем все файлы и папки из каталога /tmp, которые старше 14 дней. Задание запускается каждый день в 00:00.
* полный путь к исполняемому файлу find смотрим командой which find — в разных UNIX системах он может располагаться в разных местах.
Источник
Как использовать regex с командой find?
У меня есть некоторые изображения с именем сгенерированной строки uuid1. Например 81397018-b84a-11e0-9d2a-001b77dc0bed.формат jpg. Я хочу узнать все эти изображения, используя команду «найти»:
но это не работает. Что-то не так с регулярным выражением? Кто-нибудь может мне помочь?
7 ответов
обратите внимание, что нужно указать .*/ в начале find соответствует всему пути.
моя версия find:
на -regex найти выражение соответствует все имя, включая относительный путь от текущего каталога. Для find . этого всегда начинается с ./ , то любые каталоги.
и emacs регулярные выражения, которые имеют другие правила экранирования, чем обычные регулярные выражения egrep.
если все они находятся непосредственно в текущем каталоге, то
должны работать. (Я не совсем уверен, — я не могу получить подсчитано повторение, чтобы работать здесь.) Можно выбрать для egrep выражения -regextype posix-egrep :
(обратите внимание, что все сказанное здесь для GNU find, я ничего не знаю о BSD, который также является значением по умолчанию для Mac.)
судя по другим ответам, кажется, это может быть ошибка find.
однако вы можете сделать это таким образом:
find . * | grep -P «[a-f0-9\-]<36>\.jpg»
возможно, вам придется немного настроить grep и использовать разные параметры в зависимости от того, что вы хотите, но это работает.
попробуйте использовать одинарные кавычки ( ‘ ), чтобы избежать экранирования оболочки вашей строки. Помните, что выражение должно соответствовать всему пути, т. е. должно выглядеть так:
кроме того, кажется, что моя находка (GNU 4.4.2) знает только основные регулярные выражения, особенно синтаксис <36>. Думаю, тебе придется обойтись без этого.
вы должны использовать абсолютный путь к каталогу при применении инструкции с регулярным выражением. В вашем примере
следует изменить на
в большинстве систем Linux некоторые дисциплины в регулярном выражении не могут быть распознаны этой системой, поэтому вы должны явно указать-regexty как
простой способ — вы можете указать .* в начале, потому что найти весь путь.
на Mac (BSD найти): то же, что и принятый ответ, .*/ префикс необходим для соответствия полному пути:
man find говорит -E использует расширенную поддержку регулярных выражений
Источник
Regular expressions in grep ( regex ) with examples
Regular Expressions in grep
Regular Expressions is nothing but a pattern to match for each input line. A pattern is a sequence of characters. Following all are examples of pattern:
^w1
w1|w2
[^ ] foo
bar
6
Three types of regex
The grep understands three different types of regular expression syntax as follows:
grep Regular Expressions Examples
Search for ‘vivek’ in /etc/passswd
grep ‘vivek’ /etc/passwd
Sample outputs:
Search vivek in any case (i.e. case insensitive search)
grep -i -w ‘vivek’ /etc/passwd
Search vivek or raj in any case
grep -E -i -w ‘vivek|raj’ /etc/passwd
The PATTERN in last example, used as an extended regular expression. The following will match word Linux or UNIX in any case:
egrep -i ‘^(linux|unix)’ filename
How to match single characters
The . character (period, or dot) matches any one character. Consider the following demo.txt file:
$ cat demo.txt
Sample outputs:
- No ads and tracking
- In-depth guides for developers and sysadmins at Opensourceflare✨
- Join my Patreon to support independent content creators and start reading latest guides:
- How to set up Redis sentinel cluster on Ubuntu or Debian Linux
- How To Set Up SSH Keys With YubiKey as two-factor authentication (U2F/FIDO2)
- How to set up Mariadb Galera cluster on Ubuntu or Debian Linux
- A podman tutorial for beginners – part I (run Linux containers without Docker and in daemonless mode)
- How to protect Linux against rogue USB devices using USBGuard
Join Patreon ➔
Let us find all filenames starting with purchase:
grep ‘purchase’ demo.txt
Next I need to find all filenames starting with purchase and followed by another character:
grep ‘purchase.db’ demo.txt
Our final example find all filenames starting with purchase but ending with db:
grep ‘purchase..db’ demo.txt
How to match only dot (.)
A dot (.) has a special meaning in regex, i.e. match any character. But, what if you need to match dot (.) only? I want to tell my grep command that I want actual dot (.) character and not the regex special meaning of the . (dot) character. You can escape the dot (.) by preceding it with a \ (backslash):
grep ‘purchase..’ demo.txt
grep ‘purchase.\.’ demo.txt
Anchors
You can use ^ and $ to force a regex to match only at the start or end of a line, respectively. The following example displays lines starting with the vivek only:
grep ^vivek /etc/passwd
Sample outputs:
You can display only lines starting with the word vivek only i.e. do not display vivekgite, vivekg etc:
grep -w ^vivek /etc/passwd
Find lines ending with word foo:
grep ‘foo$’ filename
Match line only containing foo:
grep ‘^foo$’ filename
You can search for blank lines with the following examples:
grep ‘^$’ filename
Matching Sets of Characters
How to match sets of character using grep
The dot (.) matches any single character. You can match specific characters and character ranges using [..] syntax. Say you want to Match both ‘Vivek’ or ‘vivek’:
grep ‘[vV]ivek’ filename
OR
grep ‘[vV][iI][Vv][Ee][kK]’ filename
Let us match digits and upper and lower case characters. For example, try to math words such as vivek1, Vivek2 and so on:
grep -w ‘[vV]ivek6’ filename
In this example match two numeric digits. In other words match foo11, foo12, foo22 and so on, enter:
grep ‘foo54’ filename
You are not limited to digits, you can match at least one letter:
grep ‘[A-Za-z]’ filename
Display all the lines containing either a “w” or “n” character:
grep [wn] filename
Within a bracket expression, the name of a character class enclosed in “[:” and “:]” stands for the list of all characters belonging to that class. Standard character class names are:
- [[:alnum:]] – Alphanumeric characters.
- [[:alpha:]] – Alphabetic characters
- [[:blank:]] – Blank characters: space and tab.
- [[:digit:]] – Digits: ‘0 1 2 3 4 5 6 7 8 9’.
- [[:lower:]] – Lower-case letters: ‘a b c d e f g h i j k l m n o p q r s t u v w x y z’.
- [[:space:]] – Space characters: tab, newline, vertical tab, form feed, carriage return, and space.
- [[:upper:]] – Upper-case letters: ‘A B C D E F G H I J K L M N O P Q R S T U V W X Y Z’.
In this example match all upper case letters:
grep ‘[:upper:]’ filename
How negates matching in sets
The ^ negates all ranges in a set:
grep ‘[vV]ivek[^0-9]’ test
Using grep regular expressions to search for text patterns
Wildcards
You can use the “.” for a single character match. In this example match all 3 character word starting with “b” and ending in “t”:
Источник