Как искать фаилы созданные
Шпаргалка: Как смотреть через ls
| Тип времени | Команда |
|---|---|
| Модификация (mtime) | ls -l |
| Доступ (atime) | ls -lu |
| Изменение (ctime) | ls -lc |
| Создание (btime) | ls -l --time=birth (если поддерживается) |
1. Access (atime) — Доступ
- Что значит: Время последнего чтения файла.
- Когда меняется: Когда вы открываете файл (через
cat,less,cp) или когда его читает какой-то скрипт/программа. - Нюанс: В целях скорости на многих системах запись
atimeотключена или ограничена (опцияrelatime), чтобы диск не записывал данные при каждом обычном чтении.
2. Modify (mtime) — Модификация
- Что значит: Время последнего изменения содержимого файла.
- Когда меняется: Когда вы правите текст в файле, дописываете в него данные или сохраняете изменения в редакторе.
- Важно: Это именно та метка, которую вы видите по умолчанию, когда вводите
ls -l.
3. Change (ctime) — Изменение статуса
- Что значит: Время последнего изменения метаданных (индекса inode).
- Когда меняется: Когда меняется не сам текст, а информация о файле: права доступа (
chmod), владелец (chown), имя файла или его перемещение. При изменении содержимого (mtime)ctimeтоже обновляется. - Ошибка новичка: Часто путают
ctimeс временем создания (Creation), но в классическом Unix это не так.
4. Birth (btime или crtime) — Создание
- Что значит: Настоящее время создания файла.
- Когда меняется: Никогда. Устанавливается один раз при создании.
- Нюанс: Это «новый» стандарт для Linux. На старых файловых системах (до 2017-18 годов) этого поля вообще могло не быть.
Как подделать дату модификации (mtime) назад
touch -d "2020-01-01" /etc/passwd
Команда ls -l покажет старую дату. Однако ctime при этом обновится автоматически до текущего времени, потому что изменились метаданные файла (его inode). Злоумышленник не может просто так «открутить» ctime назад с помощью команды touch
find /etc/ -maxdepth 1 -type f -ctime +7 -ls
find /etc/ -maxdepth 1 -type f -ctime -19 -mtime -19 -ls |wc
Последняя команда делает это
- Первый фильтр (
-ctime -19): Находит файлы, чьи метаданные (права, имя, статус) изменились в последние 19 дней. - Второй фильтр (
-mtime -19): Из результатов первого шага оставляет только те файлы, чье содержимое также было изменено в последние 19 дней.
Важные нюансы:
- Пересечение условий: Поскольку любое изменение содержимого (
mtime) почти всегда автоматически обновляет и метаданные (ctime), эти два списка будут сильно пересекаться. Чаще всего результат будет таким же, как если бы вы оставили только-mtime -19. - Исключение: Если вы изменили права файла (
chmod) 5 дней назад (обновилсяctime), но само содержимое файла правили год назад (старыйmtime), то этот файл не попадет в ваш список, так как он не пройдет вторую проверку (-mtime -19). - Порядок имеет значение для скорости:
findпроверяет условия слева направо. Если первое условие ложно, второе он даже не будет проверять.
Если бы вы хотели найти файлы, где случилось «хотя бы одно из двух»:
Если вам нужны файлы, у которых либо контент изменился, либо права, используйте флаг -o (OR — «ИЛИ»):
bash
find /etc/ -maxdepth 1 -type f \( -ctime -19 -o -mtime -19 \) -ls
Используйте код с осторожностью.
Итог: Исходная команда — это строгий фильтр, который ищет файлы с «двойным» признаком свежести (и внутри, и снаружи). В контексте безопасности это хороший способ найти файлы, которые были недавно созданы и сразу наполнены данными.
Вот \( и вот это \) что делает
В контексте команды find круглые скобки \( \) используются для группировки условий, точно так же, как в математике.
Вот зачем они нужны:
1. Управление приоритетом (Логика)
По умолчанию find выполняет проверку условий по порядку. Если вы используете оператор -o (ИЛИ), без скобок команда может сработать не так, как вы ожидали.
Пример без скобок:find . -type f -mtime -10 -o -ctime -10
Здесь find может запутаться в приоритетах между «это файл» И «у него mtime…» ИЛИ «у него ctime…».
Пример со скобками:find . -type f \( -mtime -10 -o -ctime -10 \)
Здесь вы четко говорите:
- Обязательно найди файл (
-type f). - И (AND) этот файл должен соответствовать хотя бы одному из условий внутри скобок.
2. Почему они пишутся со слэшем \(?
В Linux символы ( и ) имеют специальное значение для самой оболочки (Bash), а не для программы find.
- Если написать просто
(, Bash подумает, что вы запускаете подпроцесс (subshell), и выдаст ошибку. - Обратный слэш
\называется экранированием. Он говорит Bash: «Не трогай эту скобку, просто передай её как текстовый символ в командуfind».
3. Пробелы обязательны
Вокруг скобок обязательно должны быть пробелы:
- Неправильно:
\(-mtime -10\) - Правильно:
\( -mtime -10 \)
Итог
Это способ сказать: «Сначала вычисли то, что в скобках, а потом примени это к остальной части команды». Чаще всего это нужно, когда вы комбинируете «И» и «ИЛИ» в одном поиске.
Что делают \
Косая линия \ (обратный слэш) нужна потому, что вы вводите команду не напрямую в find, а через Bash (командную оболочку).
В Bash обычные круглые скобки ( ) — это спецсимволы, которые означают запуск команды в отдельном процессе (subshell).
Если вы напишете:find . ( -name "123" )
Bash увидит скобки, попытается выполнить их сам, не поймет, что внутри, и выдаст ошибку: bash: syntax error near unexpected token '('. До программы find ваша команда даже не дойдет. [1, 2]
Зачем нужен \ (экранирование):
Обратный слэш говорит Bash: «Забудь, что скобка — это спецсимвол. Просто передай её как обычный текст программе find». [1, 3]
Как это видит компьютер:
- Вы пишете
\(. - Bash «съедает» слэш и передает в
findчистый символ(. - Программа
findполучает этот символ и понимает: «Ага, пользователь хочет сгруппировать условия». [1, 3]
Есть ли альтернатива?
Да, можно использовать одинарные кавычки. Они делают то же самое — защищают символ от Bash:find . '(' -mtime -1 -o -ctime -1 ')'
Итог: Слэши нужны только для того, чтобы «протащить» скобки сквозь Bash внутрь программы find в целости и сохранности. [2, 3]