Практически каждому, кто работает в операционных системах семейства UNIX, сталкивается с необходимостью найти какой-либо файл или, что сложнее, текст в файлах. Это сделать очень просто с помощью find и grep. Вы можете прочитать руководства на этим командам, а можете воспользоваться уже готовыми примерами ниже.

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

Итак, чтобы найти файл file.txt, вам нужно всего лишь набрать такую команду:

1
find /home/ -name "file.txt"

Если вам известна только часть имени, то команда будет выглядеть так:

1
find /home/ -name "*ile*"

Так же вы можете искать файлы по расширению:

1
find /home/ -name "*.txt"

Но это поиск с учётом регитра. Если же вам нужно найти файл, но регистр вам неизвестен, поменяйте name на iname:

1
find /home/ -iname "file.txt"

Пример использования: составим плейлист из всех песен в формате MP3 в домашней директории пользователя user и сохраним это в файл.

1
find /home/user -type f -name "*.mp3" > /home/user/playlist.pls

И теперь можем запустить его на бесконечное воспроизведение (loop 0) в потрясающем плейере mplayer:

1
 mplayer -loop 0 -playlist /home/user/playlist.pls

Поиск по размеру файлов

Если вам нужно найти файлы больше 1МБ, то поиск будет выглядеть так:

1
find /home -size +1M

Так можно найти все крупные файлы в каталогах пользователей (например, фильмы с разными форматами, когда никакая часть их имени неизвестна)

Поиск по дате

Очень часто, если была угроза вторжения или просто нужно найти последние изменения, нужно найти изменённые за последнее время файлы. Для этого мы используем mtime. Например, найдем файлы в каталоге /home, которые были созданы или изменены в последние 2 дня:

1
find /home -type f -mtime -2

Опция -type f указывает, что вам надо найти только файлы.

Конечно, рамки можно существенно сузить до нескольких минут опцией mmin. Например, что было изменено за последние 2 минуты?

1
find /home -type f -mmin -2

А можно найти и файлы, которые старше определенного срока. Нужно только - поменять на +. Например, найдем все файлы старше 10 дней в домашней директории:

1
find /home/user -type f -mtime +10

Поиск строки в файлах

Иногда нужно найти в файлах текст. Кстати, явление достаточно частое! Найдем текст wikiadmin.net в домашних директориях пользователей:

1
find /home -type f -exec grep -i -H "wikiadmin.net"  {} \;

Однако, это не совсем удачный пример с точки зрения запоминания. А вот grep тут будет удобнее:

1
 grep -rnl "wikiadmin.net" /home

Удаление файлов старше N дней

Ищем что-то старше N и с помощью rm -rf удаляем это:

1
 find /path/to/files* -mtime +N -exec rm -rf{} \;

Поиск дублей

поиск одинаковых файлов

1
 find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate

Собираем хеши файлов и проверяем

Неплохое дело на случай, если есть подозрение, что хакер что-то заменил, но по дате найти невозможно. Делаем хеши всех файлов в /etc (например)

1
 find /etc -type f -print0 | xargs -0 md5sum > /home/user/checksum_files.md5

проверка с фильтрацией только тех, кто изменён

1
 md5sum -c /home/user/checksum_files.md5 | grep FAILED