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.

По умолчанию подразумевается, что между ключами поиска стоит логический оператор 'И', если вы хотите, что бы вместо 'И' использовался 'ИЛИ', укажите ключ '-o'. Поскольку между ключами по умолчанию подразумевается логический оператор 'И', то выражение find принимает следующий вид: искать файлы определенного типа 'И' с определенным именем 'И' более новые чем мой файл .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"
PQ VPS сервера в 28+ странах.