Linux и Bash

7.1 find - поиск файлов

find — самая мощная команда для поиска файлов в Linux. Она может искать по имени, размеру, времени изменения и многим другим критериям.

Базовый синтаксис


                        find [путь] [критерии] [действие]
                    

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


                        find . -name "*.txt"              # найти все .txt файлы в текущем каталоге
                        find /home -name "document*"      # найти файлы, начинающиеся с "document"
                        find /etc -name "*.conf"          # найти конфигурационные файлы
                    

Поиск по типу файла


                        find . -type f                    # только файлы
                        find . -type d                    # только каталоги
                        find . -type l                    # только символические ссылки
                    

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


                        find . -size +100M                # файлы больше 100 МБ
                        find . -size -1k                  # файлы меньше 1 КБ
                        find . -size 0                    # пустые файлы
                    

Поиск по времени


                        find . -mtime -7                  # измененные за последние 7 дней
                        find . -mtime +30                 # измененные более 30 дней назад
                        find . -newer file.txt            # новее указанного файла
                    

Поиск по правам доступа


                        find . -perm 755                  # файлы с правами 755
                        find . -perm -u+x                 # исполняемые файлы для владельца
                        find . -perm /o+w                 # файлы, доступные для записи остальным
                    

Действия с найденными файлами


                        find . -name "*.tmp" -delete      # удалить временные файлы
                        find . -name "*.log" -exec ls -l {} \;  # показать подробную информацию
                        find . -name "*.txt" -exec cp {} backup/ \;  # скопировать в backup
                    
Символы в find:
. — текущий каталог
* — любое количество символов
? — один символ
[] — любой символ из скобок

7.2 grep - поиск текста

grep — команда для поиска текста в файлах. Одна из самых полезных команд в Linux.

Базовое использование


                        grep "error" file.txt             # найти строки с "error"
                        grep "ERROR" *.log                # найти "ERROR" во всех .log файлах
                        grep -r "function" /home/user/    # рекурсивный поиск в каталоге
                    

Полезные флаги


                        grep -i "error" file.txt          # поиск без учета регистра
                        grep -n "error" file.txt          # показать номера строк
                        grep -v "error" file.txt          # исключить строки с "error"
                        grep -c "error" file.txt          # подсчитать количество совпадений
                    

Регулярные выражения


                        grep "^error" file.txt            # строки, начинающиеся с "error"
                        grep "error$" file.txt            # строки, заканчивающиеся на "error"
                        grep "er.*or" file.txt            # строки с "er", затем любые символы, затем "or"
                        grep "[0-9]" file.txt             # строки, содержащие цифры
                    

Поиск в нескольких файлах


                        grep -r "TODO" .                  # найти "TODO" во всех файлах
                        grep -l "error" *.txt             # показать только имена файлов с совпадениями
                        grep -L "error" *.txt             # показать файлы без совпадений
                    

Контекст поиска


                        grep -A 3 "error" file.txt        # показать 3 строки после совпадения
                        grep -B 2 "error" file.txt        # показать 2 строки до совпадения
                        grep -C 2 "error" file.txt        # показать 2 строки до и после
                    

Практические примеры


                        # Найти все IP-адреса в логах
                        grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/auth.log
                        
                        # Найти все email адреса
                        grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt
                        
                        # Найти пустые строки
                        grep "^$" file.txt
                    

7.3 Комбинация find и grep

Комбинация find и grep позволяет создавать мощные команды поиска.

Поиск текста в определенных файлах


                        find . -name "*.py" -exec grep -l "import" {} \;  # найти Python файлы с import
                        find . -name "*.log" -exec grep "ERROR" {} \;     # найти ошибки в логах
                    

Поиск с фильтрацией по содержимому


                        find . -name "*.txt" -exec grep -q "important" {} \; -print  # найти .txt файлы с "important"
                        find . -type f -exec grep -l "TODO" {} \;                   # найти файлы с TODO
                    

Анализ логов


                        # Найти все ошибки за сегодня
                        find /var/log -name "*.log" -mtime 0 -exec grep -H "ERROR" {} \;
                        
                        # Найти файлы с определенным IP
                        find . -name "*.log" -exec grep -l "192.168.1.1" {} \;
                    

Поиск конфигурационных файлов


                        # Найти файлы с настройками базы данных
                        find /etc -name "*.conf" -exec grep -l "database" {} \;
                        
                        # Найти файлы с паролями (осторожно!)
                        find . -name "*.conf" -exec grep -l "password" {} \;
                    

Сложные комбинации


                        # Найти большие файлы с определенным содержимым
                        find . -size +10M -type f -exec grep -l "backup" {} \;
                        
                        # Найти файлы, измененные недавно, с ошибками
                        find . -mtime -1 -name "*.log" -exec grep -H "ERROR" {} \;
                    
Осторожно с поиском паролей! Не ищите пароли в открытом виде в системных файлах. Это может быть небезопасно.

7.4 locate - быстрый поиск

locate — быстрая команда поиска файлов, использующая предварительно построенную базу данных.

Базовое использование


                        locate filename                    # найти файл по имени
                        locate "*.txt"                     # найти все .txt файлы
                        locate -i "document"              # поиск без учета регистра
                    

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


                        sudo updatedb                      # обновить базу данных locate
                        # База данных обновляется автоматически, но можно принудительно
                    

Ограничение результатов


                        locate "*.log" | head -10         # показать первые 10 результатов
                        locate "*.txt" | wc -l            # подсчитать количество файлов
                    

Поиск с фильтрацией


                        locate "*.conf" | grep "nginx"    # найти конфиги nginx
                        locate "*.py" | grep "test"       # найти Python тесты
                    

Преимущества и недостатки

Преимущества locate

  • Очень быстрый поиск
  • Ищет по всей файловой системе
  • Простой синтаксис

Недостатки locate

  • База данных может быть устаревшей
  • Не ищет по содержимому файлов
  • Менее гибкий, чем find

Когда использовать locate vs find

Используйте locate для:
• Быстрого поиска файлов по имени
• Поиска по всей файловой системе
• Когда не нужны сложные критерии поиска
Используйте find для:
• Поиска по размеру, времени, правам
• Поиска в определенном каталоге
• Когда нужны сложные критерии поиска