📖 Теория — find, locate, циклы bash

К оглавлению урока

⚡ Ключевые концепции

  • find — поиск в реальной ФС: медленнее, но гибко; поддерживает -name, -type, -size, -mtime, -exec, -delete
  • locate — поиск по базе данных; быстро, но база может быть устаревшей; обновить: sudo updatedb
  • for — цикл по диапазону: for i in {1..5}; do echo $i; done
  • while — цикл по условию: while [ $counter -le 5 ]; do ((counter++)); done
  • while true — бесконечный цикл: while true; do echo "Alive" && sleep 1; done

1. Команда find

find предназначена для поиска файлов и каталогов в файловой системе. Её основная особенность — поиск выполняется рекурсивно, начиная с указанного каталога. Команда работает в реальной файловой системе, что может занимать больше времени на больших дисках, зато позволяет выполнять сложные запросы с множеством критериев.

1.1 Поиск по имени

# Поиск файла по точному имени
find /path/to/search -name "file.txt"

# Поиск файлов по маске
find /path/to/search -name "*.jpg"

1.2 Поиск по типу файла (-type)

find /path/to/search -type f   # только обычные файлы
find /path/to/search -type d   # только директории
Значение -type Что означает
fПростые файлы
dКаталоги
lСимволические ссылки
bБлочные устройства (dev)
cСимвольные устройства (dev)
pИменованные каналы
sСокеты

1.3 Поиск по размеру (-size)

# Найти .txt файлы размером больше 1 мегабайта
find /path/to/search -name "*.txt" -size +1M

Единицы: k — килобайты, M — мегабайты, G — гигабайты. Знак + — больше, - — меньше.

1.4 Поиск по дате изменения (-mtime)

# Изменено менее 5 дней назад
find /path/to/search -mtime -5

# Комбинированный поиск: < 5 дней, .txt, > 15 кБ, ошибки скрыть
find /home/ -mtime -5 -name "*.txt" -size +15k 2>/dev/null
Критерий Значение
-mtime +NИзменено более чем N дней назад
-mtime -NИзменено менее чем N дней назад
-mtime NИзменено точно N дней назад

1.5 Удаление найденных файлов (-delete)

# Удалить файлы с расширением .old
find -type f -name "*.old" -delete

# Удалить файлы, изменённые более 7 дней назад
find /path/to/search -type f -mtime +7 -delete
Внимание: -delete необратимо удаляет файлы!
Сначала запустите команду без -delete, убедитесь в списке файлов, а потом добавляйте флаг удаления.

1.6 Выполнение действий с найденными файлами (-exec)

# Установить права 644 для всех обычных файлов
find /path/to/search -type f -exec chmod 644 {} \;

# Скопировать все .txt из /root/ в /home
find /root/ -type f -name "*.txt" -exec cp {} /home \;

В шаблоне {} подставляется путь к каждому найденному файлу; \; — завершение команды.

⚠️ Проверить по документации
Современная форма: -exec chmod 644 {} + (знак + вместо \;) передаёт все найденные файлы одним вызовом команды, а не запускает команду отдельно для каждого файла. Значительно эффективнее на большом числе файлов.

2. Команда locate

locate ищет файлы по базе данных, содержащей информацию о файлах и каталогах системы. Это позволяет ей работать значительно быстрее, чем find, особенно при поиске по имени. Главный недостаток: база данных может быть неактуальной, если файловая система изменилась после последнего обновления.

2.1 Обновление базы данных

# Рекомендуется перед использованием locate
sudo updatedb

Команда перестроит базу данных с актуальной информацией о файлах в системе.

2.2 Поиск по имени и расширению

locate myfile.txt
locate *.jpg

2.3 Поиск в определённом каталоге

locate -r '/path/to/directory/*\.txt$'

Флаг -r позволяет задать регулярное выражение вместо простого шаблона.

2.4 find vs locate

Критерий find locate
Источник данных Реальная файловая система База данных (индекс)
Скорость Медленнее (обход ФС) Быстрее (запрос к индексу)
Актуальность Всегда актуально Может быть устаревшей
Критерии поиска Имя, тип, размер, дата, права... Только имя / расширение

3. Bash-циклы

Циклы в bash позволяют выполнять один и тот же блок кода несколько раз, в зависимости от условий или значений переменных. Это ключевой инструмент автоматизации.

3.1 Цикл for

Выполняет блок кода для каждого элемента в заданном списке или диапазоне.

for i in {1..5}
do
    echo "Number: $i"
done

Однострочный вариант:

for i in {1..5}; do echo "Number: $i"; done

3.2 Цикл while

Выполняет блок кода, пока заданное условие верно.

counter=1
while [ $counter -le 5 ]
do
    echo "Counter: $counter"
    ((counter++))
done

Пояснение: -le — "less than or equal" (меньше или равно). ((counter++)) — арифметическое увеличение счётчика на 1.

3.3 Бесконечный цикл (однострочник)

while true; do echo "Alive" && sleep 1; done

Выполняется до прерывания по Ctrl+C. Часто используется для мониторинга или фоновых задач.

3.4 Операторы сравнения в условиях while

Оператор Значение
-eqequal — равно
-nenot equal — не равно
-ltless than — меньше
-leless than or equal — меньше или равно
-gtgreater than — больше
-gegreater than or equal — больше или равно

4. Практический скрипт из лекции

Задание из лекции: разобрать скрипт создания директорий и копирования файлов. Скрипт создаёт текстовые файлы с текущим временем, копирует их в каталог с именем по дате, а затем выводит содержимое на экран.

#!/bin/bash
#
DATE=`date '+%d-%m-%y'`
#echo $DATE
for i in {1..5}
do
    date +'%H-%M-%S' > File-$i.txt
    sleep 5
done
mkdir -p $DATE
cp File*.txt $DATE
#cd $DATE
for FILE in $DATE/*
do
    cat $FILE
done

Что делает скрипт:

  • Устанавливает переменную DATE для текущей даты в формате "день-месяц-год"
  • В цикле for создаёт 5 файлов File-N.txt с текущим временем (час-минута-секунда), ожидая 5 секунд между созданиями
  • Создаёт каталог с именем по текущей дате (mkdir -p $DATE)
  • Копирует все File*.txt в созданный каталог
  • Во втором цикле for читает и выводит каждый файл через cat