Иногда, нужно найти все измененные файлы или папки в Unix/Linux ОС и в моей статье «Поиск последних измененных файлов/папок в Unix/Linux» я расскажу как это сделать.
Чтобы найти все файлы, которые были изменены с момента определенного времени (т.е. час назад, день назад, 24 часа назад и так далее) в Unix и Linux имеется команда find и она очень пригодиться для таких целей.
Чтобы найти все файлы, которые были изменены в течение последних 24 часов (последний полный день) в текущем каталоге и в его подкаталогах, используйте:
# find . -mtime -1 -print
Опция «-mtime -1» сообщает команде find искать модифицированные файлы за последние сутки (24 часа).
Опция «-print» сообщает «find» выводить файлы и их пути (где они лежат) и данную команду можно заменить на «-ls» если нужно вывести подробную информацию о файле.
Примеры:
Например нужно найти файлы, что были изменены за последние 30 минут в папке /home/captain:
# find /home/captain -type f -mmin -30
И приведу пример подобного, но для папки:
# find /home/captain -type d -mmin -30
Например нужно найти измененные файлы за 5 дней, но не включать в поиск вчерашний день (за последний день):
# find /home/captain -type f -mtime -5 ! -mtime -1
Для полного счастья, можно вывести время модификации и отсортировать по нему:
# find /home/captain -type f -mtime -5 ! -mtime -1 -printf '%TY-%Tm-%Td %TT %pn' | sort -r
Чтобы ограничить уровень вложенности, добавьте параметр «-depth». Например, поиск с уровнем вложенности не более 3 папок:
# find /home/captain -type f -mmin -30 -depth -3
Поиск файлов в /home/captain директории (и во всех ее подпапках) которые были изменены в течение последних 60 минут, и вывести их атрибуты:
$ find/ home/captain -type f -mmin -60 -exec ls -al {} ;
В качестве альтернативы, вы можете использовать xargs команду, чтобы достичь того же:
$ find /home/captain -type f -mmin -60 | xargs ls -l
Поиск последних измененных файлов/папок в Unix/Linux завершен.
Бывают случаи когда нужно посмотреть все новые, недавно измененные или созданные в произвольный период времени файлы в операционной системе Linux. Например, если вы системный администратор и создали файл конфигурации, но потом забыли где его сохранили или же просто хотите проверить не изменял ли кто-либо корневую файловую систему в последнее время.
Операционная система Linux, как всегда, радует множеством способов для решения этой задачи. В этой инструкции мы рассмотрим некоторые из них.
Способ 1. Утилита find
Самый распространенный способ найти новые файлы в linux — это воспользоваться утилитой find. В зависимости от ситуации и потребностей утилите передаются различные параметры, можно искать файлы в конкретном диапазоне дат, новее определенной даты или новее определенного файла. Рассмотрим все подробнее.
Можно вывести все файлы в директории и поддиректориях, а затем отсортировать по дате создания:
find /etc -type f -printf '%TY-%Tm-%Td %TT %pn' | sort -r
Но это слишком громоздко, да и не нужны нам все файлы, нам надо только новые. Следующей командой можно получить все файлы, измененные или созданные за последние 60 минут:
find /etc -type f -mmin -120
Чтобы найти последние измененные файлы linux за последних два дня используете параметр mtime:
find /etc -type f -mtime -2
Если нужно не углубляться в подкаталоги ниже третьего уровня, используйте опцию maxdepth:
find /etc -maxdepth 3 -mtime -2 -type f
Также можно задать диапазон времени, в котором был создан или изменен файл. Например, чтобы посмотреть новые файлы linux за последние семь дней, но исключая последние три дня, наберите:
find /etc -type f -mtime -7 ! -mtime -3
Все эти команды выводят только путь к файлу, но также можно посмотреть атрибуты с помощью опции —exec. Выведем подробные атрибуты новых файлов, выполнив для каждого из них утилиту ls:
find /etc -type f -mmin -120 -exec ls -al {} ;
Предыдущая команда немного сложна и запутана, намного нагляднее для этого использовать утилиту xargs:
find /etc -type f -mmin -120 | xargs ls -l
Утилита find также позволяет найти файлы новее определенного файла. Например, создадим эталонный файл:
touch /tmp/test
И найдем все файлы в корневом каталоге, созданные после его него:
find / -type f -newer /tmp/test
Способ 2. ls
Этот способ намного проще первого, но за простоту мы платим гибкостью. Команда ls тоже умеет сортировать файлы в директории по дате создания. Просто выполните:
ls -ltr
В данном случае самый новый файл будет в самом низу. Если файлов очень много можно обрезать вывод с помощью tail:
ls -ltr | tail
Выводы
Возможно, это еще не все способы найти новые файлы в Linux, но тут уже есть из чего выбрать лучшее решение для конкретной ситуации. Как показано в этой статье, базовые команды поиска find и ls могут получить еще большую гибкость в объединении с утилитами сортировки sort, а также фильтрации tail и grep.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .
Об авторе
Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.
Практические примеры, которые приведены в этой статье, помогут вам освоить очень эффективную и крайне полезную команду 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 г.
Обновлено: 01.02.2022
Опубликовано: 25.07.2016
Утилита find представляет универсальный и функциональный способ для поиска в Linux. Данная статья является шпаргалкой с описанием и примерами ее использования.
Синтаксис
Примеры
Поиск по имени
По дате
По типу файла
По правам
По содержимому
С сортировкой по дате изменения
Лимиты
Действия над найденными объектами
Запуск по расписанию в CRON
Общий синтаксис
find <где искать> <опции>
<где искать> — путь к корневому каталогу, откуда начинать поиск. Например, 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. Поиск файла по части имени:
find / -name «*.tmp»
* данной командой будет выполнен поиск всех папок или файлов в корневой директории /, заканчивающихся на .tmp
3. Несколько условий.
а) Логическое И. Например, файлы, которые начинаются на sess_ и заканчиваются на cd:
find . -name «sess_*» -a -name «*cd»
б) Логическое ИЛИ. Например, файлы, которые начинаются на sess_ или заканчиваются на cd:
find . -name «sess_*» -o -name «*cd»
в) Более компактный вид имеют регулярные выражения, например:
find . -regex ‘.*/(sess_.*cd)’
find . -regex ‘.*/(sess_.*|.*cd)’
* где в первом поиске применяется выражение, аналогичное примеру а), а во втором — б).
4. Найти все файлы, кроме .log:
find . ! -name «*.log»
* в данном примере мы воспользовались логическим оператором !.
Поиск по дате
1. Поиск файлов, которые менялись определенное количество дней назад:
find . -type f -mtime +60
* данная команда найдет файлы, которые менялись более 60 дней назад.
Или в промужутке:
find . -mmin -20 -mmin +10 -type f
* найти все файлы, которые менялись более 10 минут, но не более 20-и.
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
По типу
Искать в текущей директории и всех ее подпапках только файлы:
find . -type f
* 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 %pn’ | sort -r
* команда найдет все файлы в каталоге /data, добавит к имени дату модификации и отсортирует данные по имени. В итоге получаем, что файлы будут идти в порядке их изменения.
Лимит на количество выводимых результатов
Самый распространенный пример — вывести один файл, который последний раз был модифицирован. Берем пример с сортировкой и добавляем следующее:
find /data -type f -printf ‘%TY-%Tm-%Td %TT %pn’ | 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. Переместить найденные файлы:
find . -name «sess_*» -type f -exec mv {} /new/path/ ;
* в данном примере мы переместим все найденные файлы в каталог /new/path/.
4. Вывести на экран количество найденных файлов и папок, которые заканчиваются на .tmp:
find . -name «*.tmp» | wc -l
5. Изменить права:
find /home/user/* -type d -exec chmod 2700 {} ;
* в данном примере мы ищем все каталоги (type d) в директории /home/user и ставим для них права 2700.
6. Передать найденные файлы конвееру (pipe):
find /etc -name ‘*.conf’ -follow -type f -exec cat {} ; | grep ‘test’
* в данном примере мы использовали find для поиска строки test в файлах, которые находятся в каталоге /etc, и название которых заканчивается на .conf. Для этого мы передали список найденных файлов команде grep, которая уже и выполнила поиск по содержимому данных файлов.
7. Произвести замену в файлах с помощью команды sed:
find /opt/project -type f -exec sed -i -e «s/test/production/g» {} ;
* находим все файлы в каталоге /opt/project и меняем их содержимое с test на production.
Чистка по расписанию
Команду find удобно использовать для автоматического удаления устаревших файлов.
Открываем на редактирование задания cron:
crontab -e
И добавляем:
0 0 * * * /bin/find /tmp -mtime +14 -exec rm {} ;
* в данном примере мы удаляем все файлы и папки из каталога /tmp, которые старше 14 дней. Задание запускается каждый день в 00:00.
* полный путь к исполняемому файлу find смотрим командой which find — в разных UNIX системах он может располагаться в разных местах.
Поиск недавно измененных файлов – полезный параметр при устранении неполадок в коде или на сервере.
Также данный функционал может быть полезен в форензике или расследовании инцидента.
Какие файлы логов были изменены?
Какие файлы изменились, когда я выполнил эту команду?
Универсальная команда find может помочь вам получить ответы.
Команда, показанная ниже найдет все файлы, которые были изменены за последние пять минут в текущем каталоге.
Это только один пример.
Позвольте мне рассказать, как можно подробно перечислить файлы, к которым обращались и которые были созданы за последние n минут/дней.
Содержание
- Как найти последние измененные файлы на Linux
- Поиск файлов, измененных за последние 5 минут
- Поиск файлов, измененных за последние n дней
- Поиск файлов старше X дней
- Как найти измененные каталоги за последние n минут или дней
- Поиск файлов, к которым недавно обращались или которые были созданы
- Заключение
Как найти последние измененные файлы на Linux
Прежде чем перейти к объяснительной части, сначала я хотел бы поделиться синтаксисом того, как вы можете использовать команду find для поиска файлов, которые были изменены за последние n минут.
find [path] -type f -mmin n
Здесь n указывает, сколько минут вы хотите проверить.
Но у вас также есть некоторые опции, такие как:
- -n будет проверять файлы, измененные менее чем за n минут.
- +n будет проверять файлы, измененные более чем за n минут
- n будет проверять файлы, измененные ровно n минут назад
Аналогично, вы можете использовать -mtime вместо -mmin для проверки файлов, измененных несколько дней назад.
Поиск файлов, измененных за последние 5 минут
Предположим, я хочу найти в списке файлы, которые были изменены за последние 5 минут в каталоге var; моя команда будет выглядеть следующим образом:
find .var/ -type f -mmin -5
Как вы можете увидеть, вывод просто показывает файлы, и я не нахожу данный список полезным и читабельным.
В этом случае я добавлю -ls, чтобы получить более приятный вид и больше информации, такой как владелец файла, разрешения и время модификации.
find .var/ -type f -mmin -5 -ls
Команда find позволяет выполнять несколько действий с результатом.
Одним из таких действий является -ls.
Для команды ls не обязательно использовать find-exac или xargs.
Поиск файлов, измененных за последние n дней
Чтобы найти измененные файлы за последние n дней вместо n минут, нужно просто использовать -mtime вместо -mmin.
Предположим, я хочу найти файлы, которые были изменены за последние сутки, моя команда будет следующей:
find /media/sagar/HDD/Downloads -type f -mtime -1 -ls
Поиск файлов старше X дней
Вы можете использовать параметр mtime для поиска старых файлов, которые не были изменены в последнее время.
Допустим, вы хотите найти файлы старше 30 дней в текущем каталоге.
Используйте эту команду:
Как найти измененные каталоги за последние n минут или дней
Команда find также может вывести список измененных каталогов.
Просто замените -type f на -type d, что позволит вам искать не файлы, а каталоги.
Для демонстрации я покажу, как вы можете получить список измененных каталогов в каталоге /.cache/mozilla/firefox:
find .cache/mozilla/firefox/ -type d -mmin -5 -ls
Точно так же можно найти каталоги, над которыми вы работали несколько дней назад.
find Downloads/ -type d -mtime -1 -ls
Поиск файлов, к которым недавно обращались или которые были созданы
Как же найти файлы, к которым обращались или которые были созданы за последние n минут?
Чтобы найти файлы, к которым обращались в течение последних n минут, вам придется использовать -amin вместо -mmin.
Чтобы найти файлы, к которым обращались в течение последних 5 минут внутри моей предпочтительной директории, я бы использовал приведенную команду:
find /media/sagar/HDD/Downloads -type f -amin -5 -ls
Таким же образом можно найти файлы, созданные за последние n минут, используя -cmin вместо -amin.
find /media/sagar/HDD/Downloads -type f -cmin -5 -ls
Заключение
В принципе, возможности использования не ограничены.
Вы можете изменить его с -n на +n, и вы сможете искать более старые файлы.
Используйте ctime, и вы сможете получить недавно созданные или древние файлы.
Изучение основ позволит вам использовать команду find в соответствии с вашими потребностями.
см. также:
- 🏪 Linux для пентестера: использование Find для повышение привилегий
- 🔳 findmnt – показывает установленные в настоящее время файловые системы в Linux
- 🐧 Как удалить файлы с определенным расширением в командной строке Linux
- 🔎 Как узнать, кто редактировал файлы в системах Linux
- 👾 Как проверить систему на уязвимости процессора
- 🐧 LFCA: как повысить безопасность системы Linux
- 🐧 Как вывести список имен файлов и их содержимое на Linux bash
- 🐧 Как использовать journalctl для анализа логов на Linux