Практические примеры, которые приведены в этой статье, помогут вам освоить очень эффективную и крайне полезную команду find.
Она используется для поиска файлов и папок через командную строку Linux.
Команда find — одна из самых мощных и широко применимых команд. При этом она крайне объёмная и насчитывает более 50 опций, в которых легко запутаться, особенно в сочетании с командами exec или xargs.
Если вы сисадмин или разработчик, избежать команды find
при работе с командной строкой не получится. Так что давайте научимся её не бояться и пользоваться её возможностями в полной мере.
Для этого разберём самые распространённые случаи практического применения команды find. Но для начала покажу вам синтаксис и принцип работы с командой.
Команда find в Linux
Общий синтаксис команды find выглядит так:
find [directory to search] [options] [expression]
Всё, что в квадратных скобках, указывать необязательно. А значит, выполнить команду find можно вообще без опций и параметров. Она выдаст список всех файлов и папок в текущем расположении. Мало полезного, да?
Так что давайте взглянем на параметры подробнее:
-
directory to search
(папка поиска) — это расположение, с которого вы хотите начать поиск. Поиск по умолчанию рекурсивный и начинается с текущего расположения. -
options
(опции) содержит указание типа поиска: по имени, типу файла, времени изменения и так далее — тут может быть более 50 вариантов. -
expression
(выражение) содержит поисковый запрос. Если вы ищете файл по имени, параметр expression должен содержать имя файла. Если ищете файлы с именем, соответствующим заданному шаблону, поисковое выражение — это шаблон.
Приведу простой пример:
find . -type f -name myfile
Такая команда выполнит поиск файла (именно файла, не папки) с именем myfile
в текущей папке и подпапках. Опция -type f
сужает поиск до файлов. Точка (.
) указывает на текущую папку.
Рассмотрим несколько примеров применения команды find.
Поиск файлов и папок по имени
Так выполняется поиск файлов и папок по имени:
find . -name SEARCH_NAME
Поскольку тип объекта не указан, команда выполняет поиск и файлов, и папок.
Пример ниже — поиск файлов и папок с именем «mystuff»:
abhishek@LHB:~/Examples$ find -name mystuff
./new/mystuff
./mystuff
Поиск только файлов или только папок
Если нужно искать только файлы, на помощь придёт опция 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
Поиск без учёта регистра
Команда find по умолчанию учитывает регистр. Чтобы выполнить поиск по имени файла без учёта регистра, надо ввести опцию -iname
вместо -name
.
find . -type f -iname SEARCH_NAME
С поиском по папкам (type -d
) это тоже работает.
abhishek@LHB:~/Examples$ find -iname mystuff
./new/mystuff
./MyStuff
./mystuff
Скриншот последних трёх примеров:
Поиск файлов по расширению (важно)
Одно из самых популярных применений команды find — поиск файлов определённого типа, то есть по заданному расширению.
Скажем, вы хотите найти все файлы С++ в текущих папках. Файлы С++ имеют расширение .cpp, и вот как их можно найти:
find . -type f -name "*.cpp"
С такими опциями команда find найдёт только файлы (-type f
) с именами, оканчивающимися на .cpp
.
abhishek@LHB:~$ find . -type f -name "*.cpp"
./file.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream2/zstream_test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/zfstream.cpp
При работе с командой find всегда заключайте поисковое выражение в двойные кавычки.
С чем связана рекомендация заключать поисковый запрос в двойные или одинарные кавычки? Дело в том, что без кавычек оболочка будет работать с символом * как с джокером и выполнит подстановку.
Вот что будет, если ввести запрос без кавычек:
find . -type f -name *.cpp
Оболочка распознает подстановочный знак * и заменит его всеми файлами в текущей папке, чьи имена заканчиваются на .cpp.
Это сработает, если такой файл всего один, но если их несколько, оболочка пожалуется на некорректный синтаксис.
В нашем случае файл .cpp всего один, и после подстановки команда выглядит так: find . -type f -name file.cpp
. Она работает, поскольку file.cpp
— корректный поисковый запрос.
А вот файлов .txt в той же папке два, и когда команда расширяется до find . -type f -name another.txt new.txt
, выводится предупреждение, потому что поисковых запросов больше одного.
Именно поэтому сам поисковый запрос всегда следует заключать в двойные кавычки.
Поиск нескольких файлов с несколькими расширениями (или условием)
Команда, рассмотренная выше, нужна для поиска файлов по расширению. А что если нужно найти файлы с несколькими разными расширениями?
Вместо того чтобы прогонять команду 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
Поиск файлов в заданной папке
Все приведённые примеры иллюстрируют поиск в текущей папке, потому что команда включает в себя точку (.
).
Чтобы выполнить поиск в заданной папке, не покидая текущего расположения, можно заменить точку абсолютным или относительным путём к нужной папке.
abhishek@LHB:~/Examples$ find ./new -name mystuff
./new/mystuff
Поиск файлов в нескольких папках
Если нужные вам файлы могут находиться в нескольких папках, можно выполнить поиск во всех этих расположениях за один раз. Просто укажите все пути к папкам при введении команды find:
find ./location1 /second/location -type f -name "pattern"
Поиск пустых файлов и папок
Опция -empty
позволяет использовать команду find для поиска пустых файлов и папок.
Найти таковые в текущей папке можно следующим образом:
find . -empty
Можно указать тип объектов, чтобы искать только файлы или только папки:
find . -empty -type f
Кроме того, можно в таком режиме искать файлы по имени:
find . -empty -type f -name "*.cpp"
Поиск крупных и мелких файлов (поиск по размеру файла)
Команда 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"
Для справки:
-
c
– байты -
k
– килобайты -
M
– мегабайты -
G
– гигабайты
Поиск недавно изменённых файлов (поиск по времени изменения или создания)
Вы ведь знакомы с параметрами mtime, atime и ctime?
- Mtime – время последнего изменения файла
- Ctime – время создания файла
- Atime – время последнего доступа к файлу
Вы не раз столкнётесь с ситуацией, когда нужен список всех недавно изменённых файлов. В таких случаях на помощь приходит поиск по времени изменения.
Найти все файлы, претерпевшие изменения за последние трое суток (3*24ч), можно так:
find . -type f -mtime -3
А все файлы, созданные пять и более дней назад, ищутся так:
find . -type f -ctime +5
Понимаю, что 24 часа — большой срок. Что если нужно выявить файлы, изменённые всего пару минут назад? Для этого предусмотрены опции mmin
, amin
и cmin
.
Так выглядит команда поиска всех файлов, изменённых за последние пять минут:
find . -type f -mmin -5
Можно не только указать имя файла, но и ограничить временной промежуток с двух сторон. Команда ниже выполнит поиск всех файлов .java, изменённых не ранее 30 и не позднее 20 минут назад.
find . -type f -mmin +20 -mmin -30 -name "*.java"
Поиск файлов с определёнными настройками доступа
Надеюсь, вы имеете представление о разрешениях файлов в Linux.
Команда find позволяет выполнить поиск файлов по разрешению и режиму доступа.
find -perm mode
Поищем в текущей папке, к примеру, все файлы с режимом доступа 777:
find . -perm 777
А так можно найти все файлы с правами на чтение и запись для всех типов пользователей (только точное совпадение; файлы с правами на выполнение для всех не отобразятся):
find . -perm a=r+w
Поиск файлов по владельцу
Можно также найти файлы, принадлежащие определённому пользователю.
Вот как обнаружить в текущей папке все файлы пользователя Джона:
find . -type f -user John
Эта опция сочетается с другими, будь то размер или время и имя файла:
find . -type f -user John -name "*.cpp"
Отключение рекурсивного поиска для поиска только в текущей папке
По умолчанию команда find выполняет поиск во всех подпапках текущего расположения. Если это не требуется, можно ограничить глубину поиска значением «1». Так вы ограничитесь поиском в текущей папке, не залезая в подпапки.
find . -maxdepth 1 -type f -name "*.txt"
Исключение папки из поиска
Если нет необходимости производить поиск в той или иной папке, можно исключить её с помощью опций path, prune и логического «или».
find . -path "./directory_exclude/*" -prune -o -name SEARCH_NAME
Будьте внимательны: путь к папке должен оканчиваться на *, затем идёт -prune
и только потом -o
.
Попросту говоря, при поиске с опцией prune папка, указанная с помощью path, игнорируется. Prune всегда сопровождается флагом -o
(логическое «или»), чтобы папки, которые не были исключены, просматривались на наличие искомого объекта.
Дальнейшая работа с результатами команды find: exec и xargs
Итак, мы изучили различные способы поиска файлов по заданным параметрам. Это хорошо. А теперь следующий шаг: рассмотрим, какие действия можно выполнять с результатами команды find.
Например, как найти файлы с именем, соответствующим определённому шаблону, и переименовать их за одно действие? Или выявить и удалить пустые файлы?
Вам уже известно, что в Linux можно использовать перенаправление ввода-вывода, чтобы объединить результаты одной команды с вводом другой. Но с результатами команды find это не сработает — по крайней мере, не напрямую.
Чтобы выполнить действия над результатом команды find, есть два варианта:
- Применить exec
- Применить xargs
Использование 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
Синтаксис куда проще, верно? К тому же команда xargs тоже весьма эффективна. Подробнее о ней — в статье по ссылке.
Сочетание команд 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
Конечно, пример элементарный, но если команда grep вам знакома, можете использовать её на своё усмотрение.
И это далеко не все возможности команды find…
Перечислить все опции и примеры использования команды find практически невозможно. Её возможностям нет границ, но если вы освоите её принципы, она окажется очень кстати во многих ситуациях. Решающий фактор — как сочетается логика действия разных опций и команд.
Надеюсь, моя подборка примеров использования find была для вас полезна. Если у вас есть вопросы или предложения, как сделать эту статью лучше, добро пожаловать в комментарии.
НЛО прилетело и оставило здесь промокоды для читателей нашего блога:
— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.
— 20% на выделенные серверы AMD Ryzen и Intel Core — HABRFIRSTDEDIC.
Доступно до 31 декабря 2021 г.
Введение | |
Простой поиск | |
-name: Поиск по имени | |
Поиск по расширению | |
-not: Логическое отрицание | |
-o: Логическое ИЛИ | |
Найти и сразу скопировать в текущую директорию | |
Поиск по типу | |
Уровни вложенности | |
Поиск по размеру файла | |
Поиск по началу имени файла | |
Поиск по части имени файла | |
Переместить определённые файлы но не директории | |
-perm: Поиск по правам доступа | |
-path: Поиск путей | |
-prune: Не заходить в директорию | |
Исключить директорию из поиска | |
find + sed | |
find + grep |
Введение
find это мощный инструмент для работы с файлами.
С его помощью можно задавать различные составные условия для дальнейших действий над файлами.
Часто ипользуется как первый шаг перед копированием, перемещением, удалением, изменением
файлов, соответсвующих определённым условиям.
Поиск
Найти и вывести на экран все файлы в директории
find
find .
find . -print
-name: Поиск по имени
Найти по полному имени в текущей директории
find . -name ‘heihei.log‘
./heihei.log
Если регистр не важен
find . -iname ‘heihei.log‘
./HeiHei.log
./heihei.log
Поиск по расширению
Найти по расширению файла с помощью wildcard *
Ищем в /usr/share/doc все pdf файлы
find /usr/share/doc -name ‘*.pdf‘
-not: обратное условие
Найти в текущей директории все файлы кроме php
find . -not -name ‘*.php‘
find . ! -name ‘*.php‘
Несколько условий вместе
Логическое и
Найти все файлы, которые начинаются с log но не имеют расширения .txt
find . -name «log*» ! -name ‘*.txt‘
-o: Логическое или
Найти либо .html либо .php файлы
find . -name ‘*.html‘ -o -name ‘*.php‘
Найти и скопировать
Найти и сразу скопировать в текущую директорию
find /usr/share/doc -name ‘*.pdf‘ -exec cp {} . ;
Найти в текущей директории
find -name ‘*.pdf‘
Удалить из текущей директории
find -name ‘*.pdf‘ -delete
Поиск по типу
Чтобы найти только
файлы определённого типа
выполните 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
Найти обычные файлы определённого размера
Чтобы найти обычные файлы нужно использовать
-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 ;
-perm: поиск по правам доступа
find . -type f -perm 0600
find . -type f ! -perm 0600
-path: поиск путей
Если мне нужно посмотреть содержимое директорий
/code/php
и
/code/python
find . -path «./code/p*»
Пример укороченного результата
./code/python
./code/python/paramiko/errors/index.php
./code/python/paramiko/models
./code/python/paramiko/index.php
./code/python/ve
./code/python/ve/index.php
./code/python/datetime.php
…
./code/php
…
./code/php/mobile_headers.php
./code/php/external_func.php
./code/php/json_decode.php
./code/php/index.php
./code/php/random_int.php
./code/php/check_http_user_agent.php
-prune: ограничить глубину
С помощью
path
можно посмотреть содержимое всех поддиректорий code на букву p
/code/p*
Если нужно посмотреть только поддиректории верхнего уровня — используется -prune
find . -path «./code/p*» -prune
./code/python
./code/php
Получили только поддиректории без их содержимого
Исключить директорию из поиска
Из предыдущего параграфа понятно, что с помощью
prune
можно исключить директорию из поиска.
Пример: найти в ./code все файлы, заканчивающиеся на index.php
но проигнорировать поддиректории на p, то есть в директориях python и php не искать.
find ./code -path «./code/p*» -prune -false -o -name «*index.php»
./code/js/errors/index.php
./code/js/index.php
./code/c/index.php
./code/cpp/index.php
./code/go/pointers/index.php
./code/go/declare_variable/index.php
./code/go/constants/index.php
./code/go/index.php
./code/java/index.php
./code/dotnet/index.php
./code/ruby/index.php
./code/theory/index.php
./code/index.php
-false нужен чтобы не выводить проигнорированные директории.
Ещё один способ исключить директорию из поиска
find ./code -name «*.php« -not -path «./code/p*»
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 ‘/dvps/aws/oauth.php‘ {} ;
Эта команда ищет по всем .php файлам строку /i/aws/oauth.php и показывает в каком
файле встречается эта строка
Linux | |
FAQ | |
Debian | |
Ubuntu | |
CentOS | |
Rocky | |
Bash | |
Настройка сети | |
Файлы, директории, ссылки… | |
Изучить свободное место на диске | |
Объединить .pdf файлы | |
diff: сравнение файлов | |
find: поиск файлов | |
wget: скачивание файлов | |
kill: завершить процесс | |
curl | |
make | |
signal: системные сигналы | |
env: переменные окружения | |
localectl: язык | |
systemctl: Список активных сервисов | |
Firewall | |
SCP: обмен файлами; | |
SSH: удалённый доступ | |
cron: задания по расписанию | |
sudo | |
Мониторинг ресурсов | |
C | |
C++ |
На чтение 3 мин Просмотров 4.7к. Обновлено 01.06.2021
Часто мы оказываемся в тупике, когда нам нужно найти все файлы с одинаковыми или разными расширениями. Скорее всего, это произошло с различными пользователями Linux при использовании терминала. Одно дело искать один тип файла или файл, но что вы будете делать, если захотите найти все файлы одновременно? Эта статья приходит на помощь нашим читателям, у которых возникла такая дилемма.
Мы можем использовать различные утилиты Linux для поиска файлов в файловой системе, но поиск всех файлов или имен файлов с одинаковыми или разными расширениями может быть трудным и потребовать определенных шаблонов или выражений. В следующем разделе статьи мы разберемся с работой, синтаксисом и выполнением этих утилит.
Содержание
- Команда «Find»
- Поиск всех файлов с одним расширением
- Поиск файлов с несколькими расширениями
- Команда «Locate»
- Заключение
Команда «Find»
Одним из самых мощных инструментов поиска файлов в системе Linux является «команда find». Он ищет во всем каталоге файлы и папки, чтобы сопоставить их с выражением пользователя, и выполняет действия с этими файлами. Разрешение файла, размер файла, тип — это некоторые другие факторы, основанные на поиске файлов в Linux. Команду Find также можно комбинировать с другими утилитами, такими как sed или grep. Теперь давайте перейдем к практическому применению команды find.
Найдите синтаксис команды:
$ find Directory Options Expression
Поиск всех файлов с одним расширением
Чтобы найти все файлы с расширением файла, запишите его путь, чтобы найти команду с параметрами и выражением, указывающим расширение. В приведенном ниже примере мы найдем все файлы с расширением «.txt».
$ find . -type f -name «*.txt»
«.» в этой команде означает, что этот инструмент найдет все файлы «.txt» в текущем каталоге.
Найдите файлы «.exe» в той же команде поиска, добавив расширение как «* exe».
$ find . -type f -name «*.exe»
Файлы конфигурации также являются важной частью любой файловой системы, которую можно использовать для различных целей. Запишите эту команду для поиска файлов конфигурации в текущем каталоге.
$ find /etc -type f -name «*.conf»
Поиск файлов с несколькими расширениями
Вы также можете добавить в свою команду поиска больше, чем просто расширение, чтобы вы могли легко и быстро найти несколько файлов расширений.
Выполнение приведенной ниже команды приведет к получению файлов с расширениями «.sh» и «.txt».
$ find . -type f ( -name «*.sh» -o -name «*.txt» )
Команда «Locate»
Команда locate — более быстрый и лучший инструмент по сравнению с командой find. Когда файл инициируется, вместо поиска в файловой системе найдите и используйте базу данных для поиска. Эта база данных хранит части и биты информации, относящейся к файлам и их адресам в вашей системе.
найдите синтаксис команды:
При поиске файла с определенным расширением, например «.conf», которое рассматривается в нашем случае, добавляется путь к каталогу, в котором будет происходить процесс поиска файлов.
Найдите файлы конфигурации в текущем рабочем каталоге, используя приведенную ниже команду.
Точно так же вы можете следовать синтаксису команды locate для поиска всех файлов с любым конкретным расширением, например «.txt».
Заключение
В этом посте рассматриваются две мощные, но простые утилиты, с помощью которых вы можете найти все файлы с одинаковыми или разными расширениями. Мы предоставили вам фундаментальные концепции, касающиеся команд «найти» и «найти», и показали, как использовать эти два инструмента командной строки Linux для поиска всех файлов с несколькими расширениями.
Команда find в Linux — это мощный инструмент, который позволяет системным администраторам находить файлы и каталоги и управлять ими на основе широкого диапазона критериев поиска. Он может находить каталоги и файлы по их имени, типу или расширению, размеру, разрешениям и т. д.
Помимо поиска файлов и каталогов, сочетание команды find с другими командами позволяет вам действовать в соответствии с результатами. Добавление параметра -exec позволяет системным администраторам запускать внешние команды и выполнять такие действия, как копирование, перемещение, удаление или изменение разрешений для файлов, соответствующих указанным критериям, таким как размер, имя и т. д.
В этой статье мы начнем с объяснения основных команд поиска Linux с примерами. Это покажет вам, как найти файлы и каталоги. Затем мы покажем вам, как использовать параметр -exec для работы с файлами или каталогами в зависимости от их размера, разрешений и т. д.
Общий синтаксис команды поиска:
find {path} {name -of-file or dir-to-search} {action-to-take}
Где,
- путь указывает каталог.
- name-of-file or dir-to-search : имя файла или каталога для поиска
- действие, которое необходимо выполнить: например, скопировать, удалить, переместить и т. д.
В этом руководстве мы объясним, как найти файлы и каталоги, соответствующие указанным шаблонам. Мы также увидим, как выполнять действия с файлами или каталогами, которые находит команда find. Руководство основано на Ubuntu, но применимо к большинству дистрибутивов и версий Linux.
Найти файлы и каталоги
Поиск определенных файлов по имени или расширению
Чтобы найти определенный файл, выполните следующую команду из корня (/). Команда содержит точное имя файла, который вы ищете.
find . -name file22.txt
Выход
./test/file22.txt ./sales/file22.txt
Обратите внимание, что результаты включают путь. Это важно, если вы не знаете каталог, в котором находится файл, или если он находится более чем в одном месте.
Вы также можете искать файл в другом каталоге, оставаясь в текущем местоположении. В этом случае вам необходимо указать путь к каталогу, в котором вы хотите выполнить поиск.
find ./test -name file22.txt
Поиск определенных файлов в другом каталоге
В нашем случае мы будем искать все, начинающиеся с файла letter в тестовом каталоге.
find ./test -name file*
Выход
./test/file22.txt ./test/file30.doc ./test/file1.txt ./test/file5,doc
Поиск файлов по расширению
Чтобы найти файл в Linux с определенным расширением, добавьте его в команду.
find . -name *.txt
Выход
./test/subtest/subfil.txt ./test/file22.txt ./test/file1.txt ./home1/files32.txt ./home2/file22.txt ./qa/tags.txt
Поиск файлов и каталогов по имени
Используйте приведенную ниже команду для поиска файлов и каталогов, начинающихся с букв qa. На нашем компьютере есть файлы qatree.txt и qa.txt, а также каталог с именем qa.
Если мы запустим команду;
find ./ -name "qa*"
Он возвращает следующий вывод
./test/qatree.pdf ./test/qa.txt ./home/qa
Команда возвращает как файлы, так и каталоги, соответствующие критериям поиска. Чтобы найти только файлы или каталоги, вам нужно указать это в команде.
Найти только файлы или каталоги
Только для файлов используйте переключатель типа f.
Только файлы
find ./ -type f -name "qa*"
Выход
./test/qatree.pdf ./test/qa.txt
Только каталоги
Добавьте опцию type d, чтобы найти только каталоги.
find ./ -type d -name "qa*"
Выход
./home/qa
Команда поиска без учета регистра
Все поиски с ключом -name чувствительны к регистру и не будут давать результаты с заглавными буквами. Чтобы получить все случаи, используйте параметр -iname.
find ./ -iname "qa*"
Выход
./test/qatree.pdf ./test/qa.txt ./test/QAtest.txt ./home/qa
Поиск файла из нескольких каталогов
Чтобы найти файлы в разных каталогах, добавьте их пути в команду. В нашем случае мы проверим тестовый и числовой каталоги.
find ./test ./numeric -name file22.txt -type f
Выход
./test/file22.txt /root/numeric/file22.txt
Найти несколько файлов с разными расширениями из всех каталогов
Вы можете использовать команду find, чтобы найти несколько файлов с разными расширениями, такими как *.doc, *.txt, *.pdf и т. д. Это можно сделать отдельно, по одному расширению за раз или с помощью одной команды, которая включает все нужные расширения.
найти . -type f ( -name «*.txt» -o -name «*.pdf» -o -name «*.doc»)
выход
./test/subtest/subfil.txt ./test/qatree.pdf ./test/file22.txt ./test/qa.txt ./test/file30.doc ./books/acro.pdf ./data1/FILE22.txt ./docs/files32.txt
Найти файлы, содержащие определенный текст
Иногда вы хотите получить доступ к файлу, содержащему определенный текст, но не можете вспомнить его имя или местоположение. Эта команда позволяет вам найти все файлы, содержащие целевой текст.
Чтобы найти все файлы, содержащие слово «гиперконвергенция», используйте;
find / -type f -exec grep -l -i "hyperconvergence" {} ;
Выход
/root/numeric/hci /root/HCIP
Опция –i позволяет команде игнорировать регистры и находит текст независимо от того, написан он с заглавной буквы или нет, т. е. гиперконвергенция, гиперконвергенция и т. д.
Чтобы искать файлы в определенном каталоге, просто добавьте их в команду
find ./numeric -type f -exec grep -l -i "hyperconvergence" {} ;
Выход
./numeric/hci
Ознакомьтесь с другими примерами команд grep.
Поиск файлов и каталогов по размеру
Вы можете найти все файлы или каталоги, которые меньше, равны или больше определенного размера, в пределах определенного диапазона или пусты. Используйте подходящий формат размера в зависимости от типа файлов или каталогов, которые вы ищете.
Варианты размера включают в себя;
в — байты
к — килобайт
М — Мегабайты
Г – гигабайты
Найти файлы определенного размера — равно 30 МБ
Для поиска найдите все файлы размером 30 МБ.
find / -size 30M
Найти файлы больше указанного размера
find -size +2M
Выход
. /Downloads/ubuntu18043.iso ./.cache/pip/http/6/e/3/8/3/6e38383f41850c3e5705d48116bc52f81b92a80500f414305057 7a9c
Найти файлы размером менее 10 МБ в текущем каталоге
find . -type f -size -10M
Найдите файлы размером от 100 до 200 МБ.
При поиске файлов в пределах определенного диапазона, например, от 100 до 200 МБ
find / -size +100M -size -200M
Ищите каталоги размером более 20 КБ
найти / -тип d -размер +20k
Найдите пустые файлы и каталоги.
Файлы
найти ./ -тип f -размер 0
или же
find ./ -type f –empty
Каталоги
find ./ -type d –empty
Поиск файлов по возрасту или времени модификации
Найти файлы старше n дней
find /path/ -type f -name '*.txt' -mtime +8
-mtime +8 будет искать текстовые файлы старше 8 дней.
По дате модификации
Это будет искать файлы, измененные в течение последних 17 часов.
find . -mtime -17 -type f
Ищет каталоги, измененные за последние 10 дней.
find . -mtime -10 -type d
Поиск файлов на основе доступа или модификации
Поиск файлов по дате или времени доступа. Это позволяет вам видеть файлы, которые были или не были доступны в течение указанного периода.
Для просмотра файлов, к которым не обращались в течение последних 10 дней в домашнем каталоге.
find /home -atime +10
Файлы доступны ровно 10 дней назад
find /home -atime 10
Доступ в течение последних 10 дней
find /home -atime -10
Найти файлы, измененные за последние n дней
Вы также можете найти файлы в каталоге /home, измененные за последние 10 дней, с помощью команды;
find /home -mtime -10
Найти файлы, измененные в течение определенного периода.
Например, все файлы, измененные от 6 до 15 дней назад в домашнем каталоге.
find /home -type f -mtime +6 -mtime -15
Файлы и каталоги, к которым обращались в течение последних 10 минут
Чтобы найти файлы, к которым обращались в течение последних 10 минут, используйте параметр -amin.
find . -amin -10 -type f
Выход
./.bash_history ./[email protected]:~#
Каталоги, к которым обращались в течение последних 10 минут
find . -amin -10 -type d
Найти файлы, соответствующие определенным разрешениям
Синтаксис
$ find -perm mode
Где режим — это разрешение, которое может быть либо числовым, например 644, 655, 700, 777 и т. д., либо буквами, например u=x, a=r+x и т. д.
Вы можете задать режим следующими тремя различными способами.
Найти файлы с разрешением 777
find -perm 777
Выход
./file1
Найдите файлы с размером не менее 766
найти -пермь -766
Выход
./file2 ./file1
Команда ищет все файлы, в которых
- Владелец файла имеет права на чтение/запись/выполнение.
- Группа имеет права на чтение/запись
- Другие имеют разрешение на чтение/запись
Таким образом, он возвращает два файла, соответствующих этому критерию — файл1 и файл2. Файлы не обязательно должны иметь точные разрешения 766 и могут иметь дополнительные разрешения такой же длины, но должны иметь как минимум указанные.
Найти файлы, доступные для записи владельцу
Теперь мы будем использовать «/» для поиска файлов, доступных для записи либо их владельцу, либо группе, либо другим лицам.
find -perm /222 . ./file2 ./file3 ./file1
Приведенное выше ищет файлы, которые доступны для записи либо их владельцу, либо группе.
Это возвращает файлы, которые доступны для записи одним из них, но не обязательно обоими. Чтобы просмотреть файлы, для которых оба имеют права на запись, используйте префикс –.
find -perm -220
Выход
./file2 ./file1
Найти файлы, принадлежащие пользователю
Найти все файлы, принадлежащие Джеку
find /home -user jack
Выход
/home/jack /home/jack/examples.desktop /home/jack/.gnupg /home/jack/.gnupg/private-keys-v1.d /home/jack/ans.cgi
Найти определенные файлы, принадлежащие пользователю
Найдите все текстовые файлы, принадлежащие Джеку.
find /home -user jack -iname "*.txt"
Выход
/home/jack/docs/file32.txt
Найдите и перечислите файлы и каталоги вместе с их разрешениями
find -name "*.conf" | ls -l
Выход
total 120 drwxr-xr-x 2 root root 4096 Dec 31 13:19 backup2 drwxr-xr-x 2 root root 4096 Jan 4 11:57 Desktop drwxr-xr-x 2 root root 4096 Dec 31 11:50 Documents drwxr-xr-x 2 root root 4096 Dec 31 12:27 Downloads -rw-r--r-- 1 root root 0 Jan 4 12:02 file22.doc drwxr-xr-x 2 root root 4096 Jan 4 12:14 file23 -rw-r--r-- 1 root root 0 Jan 4 12:23 file23.txt
Найдите и действуйте в соответствии с результатами
В этом разделе мы рассмотрим, как вы можете действовать с файлами, которые соответствуют шаблону, указанному в команде find.
Поиск файлов и изменение разрешений
Найдите и измените разрешения для определенных типов файлов. В нашем случае мы будем работать с файлами PHP с разными разрешениями, как показано ниже.
[email protected]:~/ver$ ls -la total 8 drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 . drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 .. -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 base.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 qust.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 vary.php
Теперь мы будем искать все файлы PHP (выше) и заменим их разрешения на 755.
find ver -name "*.php" -type f -exec chmod 755 {} ;
Команда ищет файлы PHP в каталоге ver, а затем устанавливает для них разрешение 755 (rwxr-xr-x).
Полученные результаты
[email protected]:~/ver$ ls -la total 8 drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 . drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 .. -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 base.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 qust.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 vary.php
Поиск и изменение прав доступа к файлам и каталогам
Найдите файлы с разрешениями 644 и измените их на разрешения 655.
find . -type f -perm 644 -exec chmod 655 {} ;
Вы также можете найти каталоги с правами 644 и заменить их на 755.
find . -type d -perm 644
Выход
./docs
Папка docs имеет 644 разрешения.
drwxrwxr-x 2 jack jack 4096 Jan 3 12:45 docs
Чтобы установить его на 755, мы запускаем
find . -type d -perm 644 -exec chmod 755 {} ;
Теперь мы можем еще раз проверить, что именно 755
find . -type d -perm 755
Выход
.
./документы
Сверху мы видим, что корневые каталоги и каталоги документов имеют разрешения 755.
Команда Ls –la дает следующие данные
drwxr-xr-x 2 jack jack 4096 Jan 3 12:45 docs
Поиск и копирование файлов или каталогов
Найти и скопировать определенный файл в каталог
Приведенная ниже команда найдет файл file22.txt и скопирует его в каталог ~/tmp/images.
find -iname file22.txt -exec cp {} ~/tmp/images ;
Найдите и скопируйте один тип файлов в каталог
Чтобы найти файлы, такие как изображения с расширением jpg, в текущем каталоге и скопировать их в другое место, например в папку с изображениями, используйте;
find -iname '*.jpg' -exec cp {} ~/tmp/images ;
Это найдет и скопирует все файлы jpg в папку ~/tmp/images.
Найдите и скопируйте один файл во многие каталоги
Найдите и скопируйте один в несколько каталогов.
find ~/tmp/dir1/ ~/tmp/dir2/ $HOME/3/ -maxdepth 0 -exec cp ~/numeric/hci {} ;
Это найдет файл hci и скопирует его в три каталога /tmp/dir1/, /tmp/dir2/ и $HOME/3/.
Найти и переместить файлы в другой каталог
Чтобы переместить известный файл из каталога в другой. Переместить файл universal.php;
find ~/folder/ -type f -name universal.php -exec mv {} ~/numeric/ ;
Поиск и перемещение файлов с определенным расширением в другую папку
find ~/numeric/ -type f -name '*.php' -exec mv {} ~/folder/ ;
Найдите определенные файлы и перейдите в другую папку
find -type f -name uni*.* -exec mv {} ~/unifiles/ ;
Команда ищет все файлы с именами, начинающимися с uni и имеющими любое расширение. Затем он перемещает их в каталог /unifiles/
Поиск и перемещение файлов по возрасту
Найдите и переместите файлы старше указанного числа дней в другое место, например в архив.
find /path/ -type f -name '*.pdf' -mtime +20 -exec mv {} /backup1/ ;
Это будет искать файлы PDF старше 20 дней и перемещать их в каталог backup1.
Поиск и удаление файлов и каталогов
Синтаксис для поиска и удаления файлов или каталогов в текущем каталоге:
найти . -type f -name «файл для удаления» -exec rm -f {} ; удалить только файлы или
найти . -type d -name «каталог для удаления» -exec rm -rf {} ; удалять только каталоги
Найти и удалить только определенные файлы
Чтобы найти и удалить файлы, начинающиеся с til, используйте;
find . -type f -name "til*" -exec rm {} ;
Чтобы найти и удалить каталоги, начинающиеся с til
find . -type d -name "til*" -exec rm {} ;
Удалить как файлы, так и каталоги
find . -name "til*" -exec rm -rf {} ;
Это удалит как файлы, так и каталоги, начинающиеся с букв til.
Удалить по расширению
Ниже показано, как найти и удалить все текстовые файлы в текущем каталоге. Замените txt другим расширением, таким как bak, pdf или любым другим, которое вы хотите удалить.
find . -type f -name "*.txt" -exec rm -f {} ;
Если вы хотите, чтобы система запрашивала подтверждение перед удалением каждого файла, добавьте параметр -i, как показано ниже.
find . -type f -name "*.txt" -exec rm -i {} ;
Выход
rm: remove regular empty file './File22.txt'? y rm: remove regular empty file './file22.txt'? y rm: remove regular empty file './file23.txt'?
По умолчанию -rm не удаляет каталоги, и вам необходимо использовать параметр –r, чтобы обеспечить рекурсивное удаление. Это гарантирует удаление пустых каталогов и каталогов, содержащих файлы. Параметр -f вызывает принудительное удаление и используется как для файлов, так и для каталогов.
Найти и удалить файлы старше n дней
Найдите и удалите файлы резервных копий старше 20 дней из текущего каталога.
find . -type f -name '*.bak' -mtime +20 -exec rm {} ;
Это приведет к удалению всех файлов .bak старше 20 дней.
Найти и удалить только каталоги
Чтобы удалить каталог с именем dir22
find . -type d -name dir22 -exec rm -rf {} ;
Убедитесь, что вы соответствуете регистру имени каталога, или используйте параметр -iname.
find . -type d -iname Dir22 -exec rm -rf {} ;
Удаляет как Dir22, так и dir22
Для подтверждения перед удалением используйте параметр -i.
find . -type d -iname Dir22 -exec rm -rf -i {} ;
Выход
rm: удалить каталог ‘./Dir22’? н
rm: удалить каталог ‘./dir22’? у
В нашем случае мы ввели n для каталога Dir22, который не будет удален, и y для каталога dir22, который теперь будет удален.
Найти и удалить пустые файлы
Вы можете использовать любую из следующих команд, чтобы найти пустые файлы и удалить их автоматически.
find ./ -type f -size 0 -exec rm -f {} ;
или же
найти ./ -тип f -размер 0 | xargs rm -f
или же
найти ./ -тип f -размер 0 –удалить
Найти и удалить пустые каталоги
Чтобы удалить пустые каталоги, мы будем использовать параметр d.
find ./ -type d -empty -exec rmdir {} ;
Другой альтернативой является использование удаления вместо удаления.
find ./ -type d -empty -delete
Обратите внимание, что удаление системных или важных файлов с вашего компьютера может повредить операционную систему или приложения или привести к потере важных данных.
Чтобы избежать случайного удаления, рекомендуется использовать учетную запись пользователя без полномочий root. Кроме того, убедитесь, что вы удаляете нужные файлы, которые не нужны, и что у вас есть резервная копия всех ваших файлов данных на всякий случай.
Что дальше?
Идите вперед и попробуйте приведенные выше команды поиска Linux в своей лаборатории или НЕПРОИЗВОДСТВЕННОЙ среде. Посмотрите, можете ли вы использовать некоторые из них для автоматизации очистки файловой системы с помощью Crontab. И, чтобы освоить Linux, проверьте это онлайн курс.
Поиск файлов — относительно простая задача, когда вы используете графический интерфейс. Но он не всегда доступен. Например, если речь идет о сервере, вам придется буквально все делать при помощи командной строки.
Для поиска файлов и папок в Linux есть мощная команда — find. В этой статье мы разберем несколько примеров ее использования.
Что собой представляет команда find в Linux?
Команда find позволяет эффективно искать файлы, папки, символьные и блочные устройства.
Вот базовый синтаксис команды find:
find /path/ -type f -name file-to-search
Распишем подробно:
/path
— это путь к месту, где нужно искать файл. Это стартовая позиция для поиска файлов. В качестве пути может выступать/
или.
, что означает корневую и текущую директорию соответственно.-type
представляет файловые дескрипторы. Они могут быть следующими:f
– обычный файл, например, текстовый, файл изображения, скрытый файл.d
– директория. Для тех случаев, когда нужно найти папки.l
– символическая ссылка. Такие ссылки указывают на файлы.c
– символьные устройства. Файлы, используемые для доступа к символьным устройствам, называются файлами символьных устройств. Драйверы коммуницируют с символьными устройствами, отсылая и получая отдельные символы (байты, октеты). Примеры таких устройств — клавиатуры, звуковые карты и мыши.b
– блочные устройства. Файлы, используемые для доступа к блочным устройствам, называются файлами блочных устройств. Драйверы коммуницируют с блочными устройствами, отсылая и получая целые блоки данных. Примеры таких устройств — USB, CD-ROM.
-name
— имя (часть имени) файла, который вы хотите найти.
Команда find: практические примеры
Теперь, познакомившись с синтаксисом find, давайте рассмотрим примеры использования этой команды.
Как искать файлы по имени или по расширению
Предположим, нам нужно найти файлы, в названии которых содержится слово «style». Для этого мы используем следующую команду:
find . -type f -name style*
Результат:
А если мы хотим найти файлы с определенным расширением, например, .html, команду нужно слегка видоизменить:
find . -type f -name *.html
Результат:
Как искать скрытые файлы
Имена скрытых файлов начинаются с точки. Обычно они скрыты, но их можно увидеть в общем списке файлов в директории, если к команде ls
добавить флаг -a
.
Чтобы найти скрытые файлы при помощи find, команду нужно написать следующим образом:
find . -type f -name ".*"
Результат:
Как искать логи и конфиги
Лог-файлы имеют расширение .log. Найти их можно так:
find . -type f -name "*.log"
Результат:
Аналогично можно искать конфигурационные файлы:
find . -type f -name "*.conf"
Как искать файлы по типу
Чтобы найти символьные файлы, нужно указать дескриптор c
для -type
:
find / -type c
Аналогично, для блочных файлов нужно указать дескриптор b
:
find / -type b
Как искать директории
Команда, приведенная ниже, позволит нам найти папки, имена которых начинаются с lib. Обратите внимание, что мы используем -type d
.
find . -type d -name "lib*"
Результат:
Примечание. Чтобы увидеть, какие подпапки есть в заданной папке, нужно выполнить команду ls
-l. То, что файл является директорией, будет видно по букве d
:
Как искать файлы по размеру
Поиск файлов по размеру — одна из самых полезных функций команды find.
find / -size +250MB
Здесь мы выводим файлы, размер которых превышает 250MB.
Можно использовать и другие единицы:
- G: гигабайты
- M: мегабайты
- K: килобайты
- b: байты
Просто заменяйте <Unit Type> соответствующими единицами измерения.
find <directory> -type f -size +N<Unit Type>
Как искать файлы по времени изменения
find /path -name "*.txt" -mtime -10
-mtime +10
означает, что мы ищем файл, измененный больше 10 дней назад-mtime -10
означает, что искомый файл был изменен меньше, чем 10 дней назад-mtime 10
без + или — означает, что файл был изменен ровно 10 дней назад.
Вот содержимое моей домашней директории:
Примечание редакции Techrocks. Для вывода содержимого домашней директории использована команда ls -ltra
. Эти флаги означают вывод полной информации (-l) с упорядочиванием по времени модификации (-t) в обратном порядке (-r), со включением скрытых файлов (-a). Оригинальная статья опубликована 17 марта.
Попробуем произвести в этой директории поиск по времени изменения.
find . -type f -name ".*" -mtime +10
Выведены файлы, измененные больше 10 дней назад.
Команда find в bash-скриптах
Мы можем использовать find вместе с командами rm
или mv
и таким образом создавать полезные bash-скрипты для автоматизации действий с файлами.
Скажем, мы хотим написать скрипт, перемещающий логи, которым больше 7 дней, в бэкап. А в бэкапе хотим удалять файлы логов, которым больше 30 дней.
Мы можем написать такой скрипт и сделать его выполняемым по графику при помощи cron
. О cron
можно подробнее почитать в статье «Задачи cron и автоматизация в Linux».
Вот наш скрипт:
#!/bin/bash # Скрипт для перемещения логов старше 7 дней в бэкап по адресу /app/backup_logs/ESB0* # Переместить ESB01 логи в бэкап find /logs/esb01/audit -name "*.tar.gz" -mtime +7 -exec mv {} app/backup_logs/ESB01/ ; # Удалить из бэкапа логи старше 30 дней find /app/backup_logs/ESB01 -name "*.tar.gz" -mtime +30 -exec rm {} ;
Обратите внимание, что здесь мы используем exec
. В общем, exec
выполняет переданную ему команду (в нашем случае mv
и rm
). {}
— плейсхолдер для результатов этой команды. Наконец, мы указываем разделитель ;
. Поскольку мы не хотим, чтобы оболочка интерпретировала точку с запятой, мы экранируем ее при помощи обратной косой черты .
Этот скрипт очень полезен для архивации и удаления логов.
Итоги
В этой статье мы познакомились с командой find. Мы научились искать файлы по имени, типу, размеру и дате изменения при помощи командной строки.
Перевод статьи «How to Search for Files from the Linux Command Line».