AllInfo
Main: Info Blog Temp Mail


unix 2014-11-14 10-17-46

Расширенные возможности использования команды find в UNIX


Список ключей
-name — искать по имени файла, при использовании подстановочных образцов параметр заключается в кавычки.
-type — тип искомого: f=файл, d=каталог, l=ссылка (link), p=FIFO (First In, First Out), s=сокет.
-user — владелец: имя пользователя или UID.
-group — владелец: группа пользователя или GID.
-perm — указываются права доступа.
-size — размер: указывается в 512-байтных блоках или байтах (признак байтов — символ «c» за числом).
-atime — время последнего обращения к файлу.
-ctime — время последнего изменения владельца или прав доступа к файлу.
-mtime — время последнего изменения файла.
-newer другой_файл — искать файлы созданные позже, чем другой_файл.
-delete — удалять найденные файлы.
-ls — генерирует вывод как команда ls -dgils.
-print — показывает на экране найденные файлы.
-exec command {} \; — выполняет над найденным файлом указанную команду; обратите внимание на синтаксис.
-ok — перед выполнением команды указанной в -exec, выдаёт запрос.
-depth или -d — начинать поиск с самых глубоких уровней вложенности, а не с корня каталога.
-maxdepth — максимальный уровень вложенности для поиска. «-maxdepth 0» ограничивает поиск текущим каталогом.
-prune — используется, когда вы хотите исключить из поиска определённые каталоги.
-mount или -xdev — не переходить на другие файловые системы.
-regextype тип — указание типа используемых регулярных выражений.
-P — не разворачивать символические ссылки (поведение по умолчанию).
-L — разворачивать символические ссылки.


Поиск в директориях /usr/local/man и /opt/local/man файлов, название которых начинается на my.
$find /usr/local/man /opt/local/man -name 'my*'

Поиск по нескольким именам файлов
$find . \( -name "my*" -o -name "qu*" \) -print

Поиск нескольких типов файлов, используя регулярные выражения
$find . -type f -regex ".*\.\(jpg\|jpeg\|gif\|png\|JPG\|JPEG\|GIF\|PNG\)"

Выполнение команды
Найти все каталоги ниже указанного каталога и изменить им права доступа:
$find /path -type d -exec chmod 0755 {} \;

Опция -exec работает примерно в 10 раз медленнее, чем перенаправление вывода через xargs, поэтому данный код рекомендуется писать следующим образом:
$find /path -type d | xargs chmod 0755

Однако, директории с именами, содержащими пробелы, методом перенаправления через xargs обработаны не будут, поэтому следует использовать первый вариант, дополненный:
$find /path -type d -exec chmod 0755 "{}" \;

Поиск всех файлов php.ini от текущего каталога и замена текста в каждом найденном файле.

$find . -name 'php.ini' -exec sed -i 's/log_errors = On/log_errors = On/g' "{}" \;


Выводит список всех .txt-файлов в домашнем каталоге. Чтобы удалить эти файлы, необходимо, когда команда find выведет имя файла, ввести Y или y:
$ find $HOME/. -name *.txt -ok rm {} \;

Команду find можно использовать для удаления из каталогов и подкаталогов временных файлов, созданных в ходе обычной работы, тем самым освобождая дисковое пространство. Чтобы сделать это, используйте следующую команду:
$ find . \( -name a.out -o -name '*.o' -o -name 'core' \) -exec rm {} \;

Комбинирование команд find и cpio

$ cd /path/to/source/dir
$ find . | cpio -pdumv /path/to/destination/dir

Команда cpio предназначена для копирования файлов в/из cpio или tar архива, при этом автоматически сохраняя права доступа, временные метки и имена владельцев файлов и подкаталогов.

Следующая команда в своем отчете перечисляет первую строку в каждом текстовом файле из домашнего каталога и записывает ее в файл. Потом файл можно просмотреть командой less (см. листинг 3).

$ find $HOME/. -name *.txt -exec head -n 1 -v {} \; > report.txt
$ less < report.txt


Вывести список файлов во всей файловой системе, изменённых в течение последней минуты:
$find / -mmin -1 -print

Вывести список файлов во всей файловой системе, которые были изменены более 31 дня назад:
$find / -mtime +31 -print

Обслуживание каталогов с LOG и TMP-файлами
$ find $LOGDIR -type d -mtime +0 -exec compress -r {} \;
$ find $LOGDIR -type d -mtime +5 -exec rm -f {} \;
Первая команда просматривает все подкаталоги (-type d), найденные в каталоге $LOGDIR. Те каталоги, файлы в которых изменялись за последние 24 часа (-mtime +0), сжимаются (compress -r {}) для экономии дискового пространства. В целях увеличения свободного пространства на диске вторая команда удаляет файлы (rm -f {}), если они не используются более недели (-mtime +5). Таким образом, в заданные интервалы времени cron автоматически выполняет архивирование каталогов.


Копирование сложного дерева каталогов
$ cd /source/directory
$ find . -depth -print | cpio -o -O /target/directory


Поиск "мертвых" ссылок
Чтобы найти ссылки, которые никуда не ведут, следует использовать интерпретатор perl с командой find:
$ find / -type l -print | perl -nle '-e || print';
Эта команда начинает свой обход с самого верхнего каталога (/) и выводит все ссылки (-type l -print), которые, на взгляд интерпретатора perl, никуда не ведут (-nle '-e || print'). Для получения более исчерпывающей информации об этом способе изучите раздел Ресурсы, сайт Unix Guru Universe. Если нужно удалить эти файлы, можно перенаправить вывод на rm -f {}. Perl, как и многие другие интерпретируемые языки, можно найти в различных инструментариях UNIX.


Поиск и переименование непечатаемых каталогов
Первое, что надо сделать для достижения этой цели: с командой ls следует использовать флаг –I, чтобы получить inode. Затем используйте find для преобразования номера inode в имя файла, которое может быть изменено командой mv (см. листинг 6).
$ ls -ail
$ find . -inum 211028 -exec mv {} newname.dir \;


Вывод списка пустых файлов
$ find . -empty -exec ls {} \;

Поиск по размеру файла
$find / -size +100M -print

Поиск файлов принадлежащих определенному пользователю
$find . -user <userid>

Поиск файлов c ограничением глубины
При поиске в текущем каталоге, глубина поиска указывается от корневого каталога, а не от текущего.
$find . -maxdepth 4 -name 'restore.php'

Рекурсивное удаление файла от текущего каталога, на заданую глубину.
Удаляет все файлы restore.php от текущего каталога, но не глубже 4 уровня вложенности относительно корневого каталога /
Начинает поиск в папке /var/www, но не глубже /var/www/*/*/ и удаляет все файлы restore.php в найденном.
$find /var/www -maxdepth 4 -name 'restore.php' -exec rm -r {} \;

Игнорирование ошибок
Перенаправьте вывод STDERR в /dev/null.
$find / -name 'secret.keys' -print 2>/dev/null

3.135.209.231 / 2024-12-22_20-31-18 UTC.