Очень важно уметь вовремя найти нужную информацию в системе. Конечно, все современные файловые менеджеры предлагают отличные функции поиска, но им не сравнится с поиском в терминале Linux. Он намного эффективнее и гибче обычного поиска, вы можете искать файлы не только по имени, но и по дате добавления, содержимому, а также использовать для поиска регулярные выражения.
Кроме того, с найденными файлами можно сразу же выполнять необходимые действия. В этой статье мы поговорим о поиске с помощью очень мощной команды find Linux, подробно разберем её синтаксис, опции и рассмотрим несколько примеров.
Содержание статьи
Основная информация о Find
Команда find - это одна из наиболее важных и часто используемых утилит системы Linux. Это команда для поиска файлов и каталогов на основе специальных условий. Ее можно использовать в различных обстоятельствах, например, для поиска файлов по разрешениям, владельцам, группам, типу, размеру и другим подобным критериям.
Утилита find предустановлена по умолчанию во всех Linux дистрибутивах, поэтому вам не нужно будет устанавливать никаких дополнительных пакетов. Это очень важная находка для тех, кто хочет использовать командную строку наиболее эффективно.
Команда find имеет такой синтаксис:
find [папка] [параметры] критерий шаблон [действие]
Папка - каталог в котором будем искать
Параметры - дополнительные параметры, например, глубина поиска, и т д
Критерий - по какому критерию будем искать: имя, дата создания, права, владелец и т д.
Шаблон - непосредственно значение по которому будем отбирать файлы.
Основные параметры команды find
Я не буду перечислять здесь все параметры, рассмотрим только самые полезные.
- -P - никогда не открывать символические ссылки.
- -L - получает информацию о файлах по символическим ссылкам. Важно для дальнейшей обработки, чтобы обрабатывалась не ссылка, а сам файл.
- -maxdepth - максимальная глубина поиска по подкаталогам, для поиска только в текущем каталоге установите 1.
- -depth - искать сначала в текущем каталоге, а потом в подкаталогах.
- -mount искать файлы только в этой файловой системе.
- -version - показать версию утилиты find.
- -print - выводить полные имена файлов.
- -type f - искать только файлы.
- -type d - поиск папки в Linux.
Критерии
Критериев у команды find в Linux очень много, и мы опять же рассмотрим только основные.
- -name - поиск файлов по имени.
- -perm - поиск файлов в Linux по режиму доступа.
- -user - поиск файлов по владельцу.
- -group - поиск по группе.
- -mtime - поиск по времени модификации файла.
- -atime - поиск файлов по дате последнего чтения.
- -nogroup - поиск файлов, не принадлежащих ни одной группе.
- -nouser - поиск файлов без владельцев.
- -newer - найти файлы новее чем указанный.
- -size - поиск файлов в Linux по их размеру.
Примеры использования
А теперь давайте рассмотрим примеры find, чтобы вы лучше поняли, как использовать эту утилиту.
1. Поиск всех файлов
Показать все файлы в текущей директории:
find
find .
find . -print
Все три команды покажут одинаковый результат. Точка здесь означает текущую папку. Вместо неё можно указать любую другую.
2. Поиск файлов в определенной папке
Показать все файлы в указанной директории:
find ./Изображения
Искать файлы по имени в текущей папке:
find . -name "*.png"
Поиск по имени в текущей папке:
find . -name "testfile*"
Не учитывать регистр при поиске по имени:
find . -iname "TeStFile*"
3. Ограничение глубины поиска
Поиска файлов по имени в Linux только в этой папке:
find . -maxdepth 1 -name "*.php"
4. Инвертирование шаблона
Найти файлы, которые не соответствуют шаблону:
find . -not -name "test*"
5. Несколько критериев
Поиск командой find в Linux по нескольким критериям, с оператором исключения:
find . -name "test" -not -name "*.php"
Найдет все файлы, начинающиеся на test, но без расширения php. А теперь рассмотрим оператор ИЛИ:
find -name "*.html" -o -name "*.php"
Эта команда найдёт как php, так и html файлы.
6. Тип файла
По умолчанию find ищет как каталоги, так и файлы. Если вам необходимо найти только каталоги используйте критерий type с параметром d. Например:
find . -type d -name "Загрузки"
Для поиска только файлов необходимо использовать параметр f:
find . -type f -name "Загрузки"
6. Несколько каталогов
Искать в двух каталогах одновременно:
find ./test ./test2 -type f -name "*.c"
7. Поиск скрытых файлов
Найти скрытые файлы только в текущей папке. Имена скрытых файлов в Linux начинаются с точки:
find . -maxdepth 1 -type f -name ".*"
8. Поиск по разрешениям
Найти файлы с определенной маской прав, например, 0664:
find . -type f -perm 0664
Права также можно задавать буквами для u (user) g (group) и o (other). Например, для того чтобы найти все файлы с установленным флагом Suid в каталоге /usr выполните:
sudo find /usr -type f -perm /u=s
Поиск файлов доступных владельцу только для чтения только в каталоге /etc:
find /etc -maxdepth 1 -perm /u=r
Найти только исполняемые файлы:
find /bin -maxdepth 2 -perm /a=x
9. Поиск файлов в группах и пользователях
Найти все файлы, принадлежащие пользователю:
find . -user sergiy
Поиск файлов в Linux принадлежащих группе:
find /var/www -group www-data
10. Поиск по дате модификации
Поиск файлов по дате в Linux осуществляется с помощью параметра mtime. Найти все файлы модифицированные 50 дней назад:
find / -mtime 50
Поиск файлов в Linux открытых N дней назад:
find / -atime 50
Найти все файлы, модифицированные между 50 и 100 дней назад:
find / -mtime +50 -mtime -100
Найти файлы измененные в течении часа:
find . -cmin 60
11. Поиск файлов по размеру
Найти все файлы размером 50 мегабайт:
find / -size 50M
От пятидесяти до ста мегабайт:
find / -size +50M -size -100M
Найти самые маленькие файлы:
find . -type f -exec ls -s {} \; | sort -n -r | head -5
Самые большие:
find . -type f -exec ls -s {} \; | sort -n | head -5
12. Поиск пустых файлов и папок
find /tmp -type f -empty
find ~/ -type d -empty
13. Действия с найденными файлами
Для выполнения произвольных команд для найденных файлов используется опция -exec. Например, для того чтобы найти все пустые папки и файлы, а затем выполнить ls для получения подробной информации о каждом файле используйте:
find . -empty -exec ls -ld {} \;
Удалить все текстовые файлы в tmp
find /tmp -type f -name "*.txt" -exec rm -f {} \;
Удалить все файлы больше 100 мегабайт:
find /home/bob/dir -type f -name *.log -size +100M -exec rm -f {} \;
Выводы
Вот и подошла к концу эта небольшая статья, в которой была рассмотрена команда find. Как видите, это одна из наиболее важных команд терминала Linux, позволяющая очень легко получить список нужных файлов. Ее желательно знать всем системным администраторам. Если вам нужно искать именно по содержимому файлов, то лучше использовать команду grep.
Как выводить на экран порциями, а то список большой, проматывает быстро?
less, more
Добавить | less
Тогда можно построчно стрелками ваерх и вниз двигать, удобно.
Спасибо за запись, очень полезно!
В нижнем примере - там не +100M надо, если удаляем все log-файлы больше 100 мегабайт?
Для удаления найденного файла лучше применять параметр -delete
Существует еще один критерий, который не указали: iname - поиск по файлах, не чуствительно к регистру
Найти файлы с установленным флагом suid/guid:
find / -perm 2644
правильно: find / -perm 6644
4 - для установки suid
2 - для установки sgid
1 - для установки sticky bit
В примере выше (find / -perm 2644) права соответствуют только установленному sgid биту.
Много неточностей и опечаток
отсутствует поиск по типу файлов
например type f type l и т.д.
Вопрос по пункту "10. Поиск по дате модификации":
что подразумевается под модификацией файла? Для теста пробовал редактировать содержимое файла, менять права и т.д. Ни в каком виде mtime, atime, cmin результатов не выдавал.
Скажите, для чего в команде find /tmp -type f -name "*.txt" -exec rm -f {} \; в конце фиг. скобки и слеш? ("{} \")
Заранее спасибо.
Вместо фигурных скобок и слеша подставляется имя найденного файла.
Почему в одних примерах с параметром «-exec» используется обратный слэш «\», а в других знак плюс «+», например:
«find relative/path/to/dir -type f -exec md5sum {} + > sums.md5»
Обидно что ничего не написано про то как сохранить в файл то что нашёл
Обидно? Это не тема статьи.
Познакомьтесь с таким замечательным сервисом как гугл. Жизнь засияет новыми красками и обида пройдёт)
Просто вывести в файл. Типо этого find . -iname "*.jpg" >> list_jpg.txt
в течениЕ*
а может кто нибудь подскажет как найти один самый новый файл в папке и скопировать(про скопировать сам могу). Не за посление пять минут и не все отсортированные под дате, а тупо ОДИН САМЫЙ НОВЫЙ? Не поверите, но гуглится хреновато
Как-то так (в текущей папке):
cp "$(ls -t | head -1)" куда_копируем
Доброго! Как найти файл,точнее как правильно написать команду при параметрах : user anonim7 group anonim6 size 33c на домашнем сервере. Спасибо!
В последнем примере(перед "выводом") видимо небольшая опечатка 100 или 10мб:
"Удалить все файлы больше 100 мегабайт:
find /home/bob/dir -type f -name *.log -size +10M -exec rm -f {} \;"
Найти самые маленькие файлы и самые маленькие. Перепутали сортировку, наоборот там.
Как проводить регистронезависемый поиск? Например, jpg и JPG.
find / | grep ""
Костыли активированны!
Здравствуйте, подскажите пожалуйста как переименовать (добавить суффикс к имени, ".dir") ко всем папкам находящиеся в каталоге и во всех его под каталогов, с максимальной глубиной.
Есть структура
folder01/
folder01/dir01/
folder01/dir02/
folder02/
folder02/dir01/
folder02/dir02/
После выполнения команды хочу получиться
folder01.dir/
folder01.dir/dir01.dir/
folder01.dir/dir02.dir/
folder02.dir/
folder02.dir/dir01.dir/
folder02.dir/dir02.dir/
Не понимаю почему не работает команда:
find * -type d -exec mv {} {}.dir \;
в результате получаю переименование папок только верхнего уровня folder.dir, вложенные папки остаются без изменений, при этом выдается ошибка, что имя уже существует... чтоб избежать ошибок выполнения дополнил команду.
find * -type d -maxdepth 0 -exec mv {} {}.dir \;
кто-нибудь может подсказать как дополнить команду чтоб получить описанный выше результат.
Зачем в технических текстах упоминать себя? Я то я се. Это же не х.литература.
Как перейти к найденному файлу или папке?
Там в команде "find . -cmin 60" правильно писать "find . -cmin -60".
спасибо, очень полезно и мне помогло
Здравствуйте, помогите пожалуйста. Как найти все файлы, у которых нету владельца? Какой синтаксис команды?
Вы в команде find . -name "*.png забыли в конце " написать
Мне как-то нужно было найти в дереве каталогов файлы с длиной имен от 255 символов (да, бывает и такое).
Мое решение было примерно такое:
$ ls -pR | grep -v / | awk 'length($0) >= 255 { print $0 }' > toobigname_files
Как перенаправить вывод ошибок команды find в файл "errors.txt"?
2>errors.txt
мне приходится этой командой использую)
есть задача в паке 1800 файлов все имена уникальны кроме расширения
есть одна особеность
в имени файла типа *_01_005.bmp *_02_005.bmp *_03_005.bmp и таких групп примерно 800 их надо переместит в папку 005 а следующию группу по возрастанию 006 и такдалее
for ((a=005 a<=800 a++))
for i in *_$a.bmp
mv $i $a/
работает не корректно