Find все о нем Linux и что полезно знать для работы

Как искать фаилы созданные

Шпаргалка: Как смотреть через 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

Последняя команда делает это

  1. Первый фильтр (-ctime -19): Находит файлы, чьи метаданные (права, имя, статус) изменились в последние 19 дней.
  2. Второй фильтр (-mtime -19): Из результатов первого шага оставляет только те файлы, чье содержимое также было изменено в последние 19 дней.

Важные нюансы:

  1. Пересечение условий: Поскольку любое изменение содержимого (mtime) почти всегда автоматически обновляет и метаданные (ctime), эти два списка будут сильно пересекаться. Чаще всего результат будет таким же, как если бы вы оставили только -mtime -19.
  2. Исключение: Если вы изменили права файла (chmod) 5 дней назад (обновился ctime), но само содержимое файла правили год назад (старый mtime), то этот файл не попадет в ваш список, так как он не пройдет вторую проверку (-mtime -19).
  3. Порядок имеет значение для скорости: 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 \)
Здесь вы четко говорите:

  1. Обязательно найди файл (-type f).
  2. И (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]

Как это видит компьютер:

  1. Вы пишете \( .
  2. Bash «съедает» слэш и передает в find чистый символ (.
  3. Программа find получает этот символ и понимает: «Ага, пользователь хочет сгруппировать условия». [1, 3]

Есть ли альтернатива?

Да, можно использовать одинарные кавычки. Они делают то же самое — защищают символ от Bash:
find . '(' -mtime -1 -o -ctime -1 ')'

Итог: Слэши нужны только для того, чтобы «протащить» скобки сквозь Bash внутрь программы find в целости и сохранности. [2, 3]

Оставьте комментарий