💻 Примеры — find, locate, циклы

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

⚡ Быстрые примеры

# Найти все .log файлы в /var/log
find /var/log -name "*.log"

# Найти файлы > 1МБ, изменённые за 7 дней
find /home -type f -size +1M -mtime -7

# Обновить locate и найти файл
sudo updatedb && locate passwd

# Цикл for: числа 1..5
for i in {1..5}; do echo "Number: $i"; done

# Цикл while со счётчиком
counter=1; while [ $counter -le 3 ]; do echo $counter; ((counter++)); done

1. Примеры команды find

Поиск .txt файлов в /home

find /home -name "*.txt"

Рекурсивно ищет все файлы с расширением .txt в каталоге /home и всех подкаталогах.

Поиск только обычных файлов

find /path/to/search -type f
find /path/to/search -type d

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

find /path/to/search -name "*.txt" -size +1M

Найдёт все .txt файлы размером больше 1 мегабайта.

Поиск по дате изменения

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

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

Удаление найденных файлов

# Удалить .old файлы
find -type f -name "*.old" -delete

# Удалить файлы старше 7 дней
find /path/to/search -type f -mtime +7 -delete

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

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

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

2. Примеры команды locate

Обновить базу и найти файл

sudo updatedb
locate myfile.txt
locate *.jpg

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

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

Флаг -r — регулярное выражение вместо glob-шаблона.

3. Цикл for

Базовый цикл по диапазону

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

Выводит: Number: 1, Number: 2, ..., Number: 5

Цикл по файлам директории

for FILE in /var/log/*.log
do
    echo "File: $FILE"
done

Практический скрипт из лекции: создание файлов по дате

Файл: create_files_by_date.sh

# create_files_by_date.sh
#!/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

Скрипт:

  1. Сохраняет текущую дату в переменную DATE
  2. Создаёт 5 файлов File-1.txt ... File-5.txt, записывая в каждый текущее время
  3. Ждёт 5 секунд между созданиями (sleep 5), чтобы время в файлах различалось
  4. Создаёт директорию с именем текущей даты
  5. Копирует все файлы в эту директорию
  6. Выводит содержимое каждого файла через cat

4. Цикл while

Цикл со счётчиком

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

Счётчик начинается с 1, цикл выполняется пока $counter <= 5. После каждой итерации счётчик увеличивается на 1.

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

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

Выводит "Alive" каждую секунду. Остановить: Ctrl+C. Полезно для мониторинга или ожидания события.

Скрипт с циклом while

Файл: while_counter.sh

# while_counter.sh
#!/bin/bash
counter=1
while [ $counter -le 5 ]
do
    echo "Iteration: $counter"
    ((counter++))
done
echo "Done!"

5. Скрипт ДЗ: myfirstbashscript.sh

Пример скрипта для домашнего задания (подробное описание в homework.html):

Файл: myfirstbashscript.sh

# myfirstbashscript.sh
#!/bin/bash
USER=Andrew
date
echo "hello $USER!"
pwd
ps -ef | grep bioset | grep -v grep | wc -l
ls -la /etc/passwd | awk '{print $1}'

Строки объяснены:

  • USER=Andrew — переменная с именем (не системная $USER)
  • date — вывести текущую дату и время
  • echo "hello $USER!" — приветствие с именем из переменной
  • pwd — показать, из какой директории работает скрипт
  • ps -ef | grep bioset | grep -v grep | wc -l — подсчитать процессы bioset (без строки самого grep)
  • ls -la /etc/passwd | awk '{print $1}' — вывести права файла /etc/passwd (первый столбец)