Содержание

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

Поиск по времени, размеру

Найдем файлы, которые не читали более чем (условие 'более чем' задается знаком '+') 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, для того что бы увидеть его полный вид, перед выполнением, является хорошим тоном.

Примеры использования

find ./ -type f | xargs -d\\n md5sum | sort | uniq -D -w 32 >duplicates.txt
#!/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"