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, убедитесь в списке файлов, а потом добавляйте флаг удаления.
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
| Оператор | Значение |
|---|---|
-eq | equal — равно |
-ne | not equal — не равно |
-lt | less than — меньше |
-le | less than or equal — меньше или равно |
-gt | greater than — больше |
-ge | greater 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