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

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

Шпаргалка: Как смотреть через ls

Тип времениКоманда
Модификация (mtime)ls -l
Доступ (atime)ls -lu
Изменение (ctime)ls -lc
Создание (btime)ls -l --time=birth (если поддерживается)

1. Access (atime) — Доступ

  • Что значит: Время последнего чтения файла.
  • Когда меняется: Когда вы открываете файл (через catlesscp) или когда его читает какой-то скрипт/программа.
  • Нюанс: В целях скорости на многих системах запись atime отключена или ограничена (опция relatime), чтобы диск не записывал данные при каждом обычном чтении.

2. Modify (mtime) — Модификация

  • Что значит: Время последнего изменения содержимого файла.
  • Когда меняется: Когда вы правите текст в файле, дописываете в него данные или сохраняете изменения в редакторе.
  • Важно: Это именно та метка, которую вы видите по умолчанию, когда вводите ls -l.

3. Change (ctime) — Изменение статуса

  • Что значит: Время последнего изменения метаданных (индекса inode).
  • Когда меняется: Когда меняется не сам текст, а информация о файле: права доступа (chmod), владелец (chown), имя файла или его перемещение. При изменении содержимого (mtimectime тоже обновляется.
  • Ошибка новичка: Часто путают 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]

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