shell команда find Линукс
Читайте также Временные метки файла (Access, Modify, Change) в Linux
Утилита find - наиболее эффективное средство поиска и «массовой обработки» файлов. Find - это не столько средство поиска, сколько инструмент для обхода файловой иерархии. Вы можете удалять файлы, соответствующие критериям поиска или даже применять к ним любую произвольную команду. Для применения команды служит ключ -exec. По умолчанию, find возвращает все файлы после текущего в рабочей директории.
Популярные варианты команды find:
find . -type f | xargs grep -ni 'logon home'
Альтернатива рекурсивоное использование Использование grep, egrep, в примере поиск производится из текущей директории
grep -r -i 'logon home' .
Рекурсивно во всех файлах заменить имя одного домена на другое
find /var/www/task42.topadm.in/wp-content/cache/supercache -type f -print0 | xargs -0 sed -i 's/task42\.darkfire\.cf/lastwp\.darkfire\.cf/g'
Замена путей для всех файлов в текущей директории, команда пригодится для переноса сайтов:
find . -type f -name '*' -exec sed -i -r 's%что_меняем%на_что_меняем%g' {} \;
Обнулить рекурсивно все error.log и вывести список обработанных файлов:
for k in `find /var/www/ -type f -name error.log`; do echo $k && echo > $k ;done
Найти файлы старше 60 минут и удалить их:
find /var/lib/pg-archive/ -type f -mmin +60 | xargs -I % rm -f %
Список ключей find
- -name — искать по имени файла, при использовании подстановочных образцов параметр заключается в кавычки.
find . -type f -name '.htaccess' -ls
- -regex - спользование более сложных регулярных выражений. Например, удалить Настройка почтового сервера Postfix email
find /var/vmail/* -type f -regex ".*\.\(mail\|mail:.*\)" -mtime +30 -delete -print
- -type — тип искомого: f=файл, d=каталог, l=связь (link).
- -user — владелец: имя пользователя или UID.
find . -user <username>
- -group — владелец: группа пользователя или GID.
- -perm — указываются права доступа.
- -size — размер: указывается в 512-байтных блоках или байтах (признак байтов — символ «c» за числом).
- -atime — время последнего обращения к файлу.
- -ctime — время последнего изменения владельца или прав доступа к файлу.
- -mtime — время последнего изменения файла.
- -newer — искать файлы созданные позже указанной даты. Можно указать конкретный файл. Например найти все файлы в каталоге etc время создания/изменения которых позже даты создания файла now
find /etc -newer /tmp/now
- -delete — удалять найденные файлы.
- -ls — генерирует вывод как команда ls -dgils.
- -print — показывает на экране найденные файлы.
- -exec command {} \; — выполняет над найденным файлом указанную команду; обратите внимание на синтаксис.
- -ok — перед выполнением команды указанной в -exec, выдаёт запрос.
- -depth — начинать поиск с самых глубоких уровней вложенности, а не с корня каталога.
- -prune — используется, когда вы хотите исключить из поиска определённые каталоги.
- -mmin - предназначена для поиска файлов/каталогов с последним изменением в минутах, например
Найти файлы старше 2 часов: find . -mmin +120 Найдите файлы, которым менее 2 часов: find . -mmin -120
Поиск по времени, размеру
Найдем файлы, которые не читали более чем (условие 'более чем' задается знаком '+') 30 дней:
find . -atime +30 -print
Для поиска файлов, которые вы не модифицировали какое-то время, используйте ключ -mtime, а для файлов у которых определенное время назад не менялись права доступа используйте -ctime. Число после символа '+' задает количество дней (суток). Для того, что бы узнать какие файлы были модифицированы сегодня, попробуйте:
find . -mtime -1 -print
Эта команда покажет вам какие файлы были модифицированы за последние сутки. Заметьте, что для указания времени 'меньше чем' следует указать знак '-'.
Все три ключа time в качестве параметра используют суточные интервалы. Если вы хотите использовать более точные интервалы времени, то вам может помочь ключ -newer, который позволяет сравнивать время модификации, последнего чтения или смены прав одного файла с другим с точностью до минуты. Например для того что бы поглядеть какие скрытые (файлы с точкой в начале) были изменены с тех пор как вы последний раз изменили файл .cshrc, вы должны выполнить такую команду:
find . -type f -name ".*" -newer .cshrc -print
Обратите внимание, что мы включили в эту команду ключ -type с параметром '-f', который устанавливает тип искомого 'файл', так как в данном случае нам не нужны изменившиеся каталоги. Ключ -name будет искать файлы с именем начинающимся на точку, а ключ -newer отберет файлы, которые модифицировались позже файла .cshrc.
Продемонстрируем разницу между логическим 'И' и логическим 'ИЛИ'. Если я хочу найти все файлы в моем домашнем каталоге, которые не использовались последние 7 дней 'И' их размер больше чем 10Мб, то я использую следующую команду:
find . -atime +7 -size +20480 -print
Однако, если я хочу найти файлы которые не использовались последнюю неделю 'ИЛИ' их размер больше чем 10Мб, то мне придется выполнить такую команду:
find . -atime +7 -o -size +20480 -print
Если вы будете использовать ключ '-size', вам придется немного повычислять, так как он использует в качестве параметра число 512-байтных блоков в файле. Я могу воспользоваться командой expr для облегчения этого процесса:
find . -atime +7 -o -size +`expr 10 \* 1024 \* 2` -print
Заметьте, что в этой команде в обратных кавычках (это знак ` в левом верхнем углу вашей клавиатуры) заключено то что надо вычислить. Нам остается поставить перед выражением знак плюс, так как мы хотим найти файлы 'более чем' 10Мб размера.
Для того что бы поглядеть заранее то, что сосчитает команда expr, припишите впереди команды find команду echo:
echo find . -atime +7 -o -size +`expr 10 \* 1024 \* 2` -print find . -atime +7 -size +20480 -print
Вообще проверка сложного выражения find, для того что бы увидеть его полный вид, перед выполнением, является хорошим тоном.
Примеры использования
- Вывести список файлов во всей файловой системе, чей размер 100 Мб и больше:
# find / -size +100M -print
- Вывести список файлов во всей файловой системе, изменённых в течение последней минуты:
find / -mmin -1 -print
- Вывести список файлов, которые были изменены в течение последних 24 часов:
# find . -mtime -1 -type f -print # find . -mtime -1 -type f -exec ls -l {} \; # find . -mtime -1 -type f -print | wc # находим и командой wc считаем количество # find . -mtime -1 -type f -delete # удаляем эти файлы
- Сменить рекурсивно права на 644 на все файлы начиная с текущей директории:
$ find . -type f -exec chmod 644 {} \;
- Сменить рекурсивно права на 755 на все директории начиная с текущей директории:
$ find . -type d -exec chmod 755 {} \;
- Поиск директорий, доступных на запись, относительно текущей:
$ find . -perm -2 -type d -ls 540771 4 drwxrwxrwx 2 user user 4096 Мар 3 20:49 ./.clamtk/viruses 540772 4 drwxrwxrwx 2 user user 4096 Мар 3 20:49 ./.clamtk/history
- Рекурсивно выведет список файлов, имена которых соответствуют указанному шаблону "*.py":
$ find ./ -name "*.py"
- Поиск файлов с установленным SUID -бит -битом
$ find / -type f -perm -04000 -ls 622 28 -rwsr-xr-x 1 root root 26228 Янв 28 20:07 /bin/fusermount 113 36 -rwsr-xr-x 1 root root 34696 Май 12 2009 /bin/ping 114 32 -rwsr-xr-x 1 root root 30492 Май 12 2009 /bin/ping6 144 48 -rwsr-xr-x 1 root root 47096 Окт 23 00:54 /bin/umount 91 72 -rwsr-xr-x 1 root root 72188 Окт 23 00:54 /bin/mount 135 32 -rwsr-xr-x 1 root root 31124 Июл 31 2009 /bin/su find: `/etc/cups/ssl': Permission denied find: `/etc/chatscripts': Permission denied find: `/etc/ppp/peers': Permission denied 95333 8 -rwsr-x--- 1 root gnokii 5548 Апр 30 2009 /usr/sbin/mgnokiidev
чтобы избавится от ошибок Permission denied, команду можно запустить так
$ find / -type f -perm -04000 -ls 2>/dev/null
то есть сообщения об ошибках (2 – это дескриптор потока STDERR) выбрасываются, остается лишь нормальный вывод STDOUT.
- Все файлы с расширением jpg переносит в директорию Images
$ find /var/phoenix/ -name “*.jpg” | xargs -I mv {}/var/phoenix/Images
- Поиск дубликатов файлов:
find ./ -type f | xargs -d\\n md5sum | sort | uniq -D -w 32 >duplicates.txt
- Перемещает все файлы меньше 1MБ в папку tiny
$ find /var/phoenix/Images/ -name “*.jpg” -size -1024k | xargs -i mv {} /var/phoenix/Images/tiny
- Скрипт рекурсивно в файлах ищет строку
#!/bin/bash # Скрипт рекурсивно перебирает все файлы начиная с директории запуска. # И ищет в них вхождение переданной строки и выводит на консоль # в запускаемый скрипт нужно передать парметр - строку поиска, например # ./find_xargs.sh ivsenaidu.ru FIND="/usr/bin/find" XARGS="/usr/bin/xargs" GREP="/bin/grep" # Directory search SDIR=`pwd` #SDIR=$0 # The search string SSTR=$1 echo Find \'$SSTR\' into \'$SDIR\':; $FIND $SDIR | $XARGS $GREP -ni "$SSTR"
📌 Для тестирования скриптов, установщиков VPN, Python ботов рекомендуем использовать надежные VPS на короткий срок. Если вам нужна помощь с более сложными задачами, вы можете найти фрилансера, который поможет с настройкой. Узнайте больше о быстрой аренде VPS для экспериментов и о фриланс-бирже для настройки VPS, WordPress. 📌
💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!7 Самых Популярных Статей
- Как запустить скрипты и веб-приложения на Python
- Что такое страны TIER 1,2,3
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Установка и тестирование веб-панели HestiaCP
- Китайский VPN Shadowsocks простая установка и настройка
- top, htop, atop определение загрузки ОС (Load average, LA)
- Использование rsync в примерах