Зачастую требуется найти файлы, которые были модифицированы/созданы недавно, или за какой-либо промежуток времени. Например, администратор изменял настройки системы, но забыл, где он их сохранил. Или вы хотите проверить изменялись ли, и как, ваши файлы. Если вам необходимо найти недавно измененные файлы в linux, это можно сделать с помощью команды find.
Чтобы найти недавно модифицированные файлы, отсортированные в обратном порядке (то есть файл, измененный последним, будет показан первым), используется команда вида:
Вышеприведенная команда сортирует файлы в /etc (и поддиректориях) в обратном порядке по времени их изменения, и выводит отсортированный список вместе с их расположением в файловой системе и временем последнего изменения. Если вы также хотите проверить директории, опустите опцию «-type f».
Поиск файлов, которые были модифицированы в последние 60 минут в директории /target_directory и во всех ее поддиректориях:
Поиск файлов, которые были модифицированы в последние 2 дня в директории /target_directory и во всех ее поддиректориях:
Поиск файлов, которые были модифицированы в последние 2 дня в директории /target_directory и ее поддиректориях глубиной до 3 уровня:
Вы также можете задать диапазон времени модификации. Поиск файлов, которые были модифицированы в последние 7 дней, но не позднее чем 3 дня назад:
Все эти команды выводят только путь к найденным файлам. Вы можете также детализировать вывод информации с помощью опции «-exec». Поиск файлов в директории /target_directory (и во всех ее поддиректориях), которые были модифицированы в последние 60 минут и вывод атрибутов файлов:
В качестве альтернативы вы можете использовать для этого команду xargs:
Обратите внимание, что эти команды найдут также файлы, созданные в заданный промежуток времени.
Смотрю на эти сложности и радует что народ пробует все средства для достижения цели. Задача понятна, но решение не универсальное. А что, если надо скопировать данные только за 14-16 Января 2009? Используйте: find -mtime +$(expr $(expr $(date +%s) — $(date -d «Jan 14 2009» +%s)) / 3600 / 24) -mtime -$(expr $(expr $(date +%s) — $(date -d «Jan 16 2009» +%s)) / 3600 / 24) -type f -exec cp <> TARGET \;
Если надо создать структуру каталогов: find -mtime +$(expr $(expr $(date +%s) — $(date -d «Jan 14 2009» +%s)) / 3600 / 24) -mtime -$(expr $(expr $(date +%s) — $(date -d «Jan 16 2009» +%s)) / 3600 / 24) -type d -exec mkdir TARGET/<> \;
Какойй перл?? проще ман по find почтать а не плодить велосипеды У вас много скриптов на пер/питоне/подставить_нужное на сервере крутится? или просто лениво для примитивных задачек освоить команду man ? P.S больше велосипедов,красивых и разных
1. Несколько лет назад BSDшный date не умел показывать произвольные даты, сейчас не знаю. Такая штука канала только для GNU.
2. Сравните скорость для большого, но обозримого количества файлов: $ for N in ‘seq 1 1 100000’ ; do echo «zzz» > ./$N.testfile ; done $ time find ./ -type f -mtime -1 -exec cp <> ../bbbbbb \;
real 4m23.219s user 0m21.110s sys 3m47.518s $ time cp $(ls -1) $ mkdir ../cccccc $ time cp $(ls -1) ../cccccc/
real 0m5.298s user 0m0.906s sys 0m3.995s $
Но с мыслью я согласен, надо использовать find. $ time cp $(find ./ -type f -mtime -1) ../dddddd/
cp обламывается, потому что столько много аргументов не лезет в буфер командной строки шелла. for — [почти] точно такая же команда шелла с точно таким же буфером. Соответственно, for тоже обломается.
Расово верное решение здесь — передавать стопицот аргументов не через буфер, а через стандартный поток ввода-вывода. В него и двестипицот аргументов влезет:
ls -l . | awk <. >| while read f; do something $f; done
ls -tr /DIR1/DIR2/DIR3/* | while read f; . — все-таки обломалось.
cd /DIR1/DIR2/DIR3/; ls -tr * | while read f; .
Источник
Поиск в Linux с помощью команды find
Утилита find представляет универсальный и функциональный способ для поиска в Linux. Данная статья является шпаргалкой с описанием и примерами ее использования.
Общий синтаксис
— путь к корневому каталогу, откуда начинать поиск. Например, find /home/user — искать в соответствующем каталоге. Для текущего каталога нужно использовать точку «.».
— набор правил, по которым выполнять поиск.
* по умолчанию, поиск рекурсивный. Для поиска в конкретном каталоге можно использовать опцию maxdepth.
Описание опций
Опция
Описание
-name
Поиск по имени.
-iname
Регистронезависимый поиск по имени.
-type
Тип объекта поиска. Возможные варианты:
f — файл;
d — каталог;
l — ссылка;
p — pipe;
s — сокет.
-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
-print
Показать найденное.
-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.
* команда найдет все файлы в каталоге /data, добавит к имени дату модификации и отсортирует данные по имени. В итоге получаем, что файлы будут идти в порядке их изменения.
Лимит на количество выводимых результатов
Самый распространенный пример — вывести один файл, который последний раз был модифицирован. Берем пример с сортировкой и добавляем следующее:
find /data -type f -printf ‘%TY-%Tm-%Td %TT %p\n’ | sort -r | head -n 1
Поиск с действием (exec)
1. Найти только файлы, которые начинаются на sess_ и удалить их:
* -print использовать не обязательно, но он покажет все, что будет удаляться, поэтому данную опцию удобно использовать, когда команда выполняется вручную.
* в данном примере мы использовали 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 удобно использовать для автоматического удаления устаревших файлов.
* в данном примере мы удаляем все файлы и папки из каталога /tmp, которые старше 14 дней. Задание запускается каждый день в 00:00. * полный путь к исполняемому файлу find смотрим командой which find — в разных UNIX системах он может располагаться в разных местах.