Как известно в Linux абсолютно все является файлом, т.е. ко всему можно получить доступ через файловую систему. Поэтому в Linux по умолчанию доступны команды для рекурсивного поиска файлов и директорий по определенным критериям, например команда find.
Команда find
find — команда принимает критерий поиска и возвращает найденные результаты. Например find /путь/до/директории/поиска критерий
wildcard (групповые символы) — могут использоваться для задания критерия поиска. Например, «*» wildcard означает поиск любого символа, т.е. «*.txt» будет искать любые текстовые файлы (файлы с расширением .txt) или «*script» будет искать любой текст где встречается слово script.
Рекурсивный поиск по умолчанию — команда find будет искать рекурсивно, т.е. поиск будет осуществлен в текущей директории и во всех вложенных директориях, вне зависимости от их количества и уровня вложенности.
ctime (change time) — время последнего изменения мета данных (данных о владельце, правах доступа и т.д.)
atime (access time) — время последнего доступа к файлу, чтения или записи.
mtime (modified time) — время последнего изменения содержимого файла.
Примеры использования команды find
Не забывайте, что по умолчанию аргументы суммируются: результаты соответствуют всем введенным критериям. Вы можете указать вариативное соответствие (OR) с помощью -o аргумента.
Показать все файлы в текущей директории
find .
Критерий поиска не задан — будет найдено все содержимое указанной директории. «.» — это текущая директория
Найти все директории содержащие «tmp»
find / -type d -name "tmp
«/» — root директория, т.е. поиск осуществляется по всей файловой системе
-type d — будут возвращены только директории
-name «tmp» — поиск будет осуществлен только по названию содержащиму «tmp»
Найти все имена файлов содержащие текст «ssh» в любом регистре и не включать в результаты директории
find / -type f -iname *ssh*
/ — root директория, т.е. поиск осуществляется по всей файловой системе
-type f — поиск по файлам
-iname — поиск по именам без учета регистра
*ssh* — поиск текста «ssh», который может быть находится в любом месте
Найти все имена файлов содержащие текст «ssh» в любом регистре и не включать в результаты директории, а также любые .gz файлы или файлы содержащие «sshd» в имени
find / -type f -iname *ssh* ! -name "*.gz" ! -name "sshd*"
! — логическое «NOT», т.е. исключение определенных результатов из возвращаемого результата предыдущего критерия
Найти все имена файлов содержащие текст «ssh» в любом регистре, которые являются .gz файлами или содержат «sshd*» в имени, игнорировать имена директорий
find / -type f -iname *ssh* -name "*.gz" -o -name "sshd*"
-o — логическое «OR», возвращает результаты указанные в дополнительном критерии
Найти все файлы не принадлежащие root пользователю
find / ! -user root -type f
Найти все файлы, которые были изменены за последние 2 дня
find / -ctime -2
-ctime -2 — последние два дня, вместо знака минус — можно было использовать +, тогда были возвращены все файлы и директории измененные до последних двух дней. Подобный подход используется также для atime и mtime. Чтобы указать минуты вместо дней можно воспользоваться аргументом cmin
Найти все файлы, размер которых больше больше 1 Мегабайта, но меньше 3 Мегабайт
find / -size +1M -size -3M
+ — знак плюс означает «больше чем», а — знак минус означает «меньше чем