Чтение онлайн

ЖАНРЫ

Основы программирования в Linux
Шрифт:

# find / -mount -name test -print

/usr/bin/test

#

Мы нашли все тот же файл на нашей машине, но на сей раз гораздо быстрее и без поиска в смонтированных файловых системах.

Полная синтаксическая запись команды

find
выглядит следующим образом:

find [путь] [опции] [критерии] [действия]

Часть записи

[путь]
понятна и проста: вы можете указать абсолютный путь поиска, например,
/bin
, или относительный, например
..
При необходимости можно задать несколько путей — например,
find /var /home
.

В табл. 2.10 перечислены основные

опции команды.

Таблица 2.10

Опция Описание
– depth
Поиск в подкаталогах перед поиском в самом каталоге
– follow
Следовать по символическим ссылкам
– maxdepths N
При поиске проверять не более
N
вложенных уровней каталога
– mount
(или
– xdev
)
Не искать в каталогах других файловых систем

Теперь о критериях. В команде

find
можно задать большое число критериев, и каждый из них возвращает либо
true
, либо
false
. В процессе работы команда
find
рассматривает по очереди каждый файл и применяет к нему все критерий в порядке их определения. Если очередной критерий возвращает значение
false
, команда
find
прекращает анализ текущего файла и переходит к следующему; если критерий возвращает значение
true
, команда применяет следующий критерий к текущему файлу или совершает заданное действие над ним. В табл. 2.11 перечислены самые распространенные критерии; полный список тестов, которые можно применять в команде
find
, вы найдете на страницах интерактивного справочного руководства.

Таблица 2.11

Критерий Описание
– atime N
К файлу обращались последний раз
N
дней назад
– mtime N
Файл последний раз изменялся
N
дней назад
– name шаблон
Имя файла без указания пути соответствует заданному шаблону. Для гарантии того, что шаблон будет передан в команду
find
и не будет немедленно обработан командной оболочкой, его следует всегда заключать в кавычки
– newer другой файл
Текущий файл, измененный позже, чем другой файл
– type С
Файл типа
C
, где
C
может принимать определенные значения; наиболее широко используемые "
d
" для каталогов и "
f
" для обычных файлов. Остальные обозначения типов можно посмотреть на страницах интерактивного справочного руководства
– user имя пользователя
Файл принадлежит пользователю с заданным именем

Вы также можете объединять критерии с помощью операторов. Как показано в табл. 2.12, у большинства из них две формы записи: короткая и более длинная форма.

Таблица 2.12

Оператор, короткая форма Оператор, длинная форма Описание
!
– not
Инвертирование критерия
– а
– and
Оба критерия должны быть истинны
о
– or
Один из критериев должен быть истинным

Изменить порядок проверки критериев и выполнения операторов можно с помощью скобок. Поскольку в командной оболочке у них есть особое назначение, скобки также следует выделять с помощью обратного слэша. Кроме того, если вы применяете шаблон для имени файла, то следует использовать кавычки, чтобы оболочка не выполняла подстановку имени, а прямо передала шаблон команде

find
. Например, если вы хотите задать критерий "измененный позже, чем файл
X
, или с именем, начинающимся со знака подчеркивания", его можно записать следующим образом:

\(-newer X -о -name "_*" \)

Мы приведем пример сразу после описания "Как это работает". А сейчас выполните упражнение 2.16.

Упражнение 2.16 Применение команды
find
с критериями

Попытаемся найти в текущем каталоге файлы, измененные после модификации файла while2.

$ find .
– newer while2 -print

.

./elif3

./words.txt

./words2.txt

./_trap

$

Все чудесно, за исключением того, что вы нашли ненужный вам текущий каталог. Вас интересуют только обычные файлы, поэтому добавьте дополнительный критерий

– type f
.

$ find .
– newer while2 -type f -print

./elif3

./words.txt

./words2.txt

./_trap

$

Как это работает

Как это работает? Вы определили, что команда

find
должна искать в текущем каталоге (
.
) файлы, измененные позже, чем файл while2 (
– newer while2
), и, если этот критерий пройден, проверять с помощью следующего критерия (
– type f
), обычные ли это файлы. В заключение вы применили действие, с которым уже сталкивались,
– print
, просто для того чтобы подтвердить, что файлы были найдены.

Теперь найдем файлы с именами, начинающимися с символа подчеркивания или измененные позже, чем файл while2, но в любом случае обычные файлы. Этот пример покажет, как объединять критерии с помощью скобок.

$ find . \( -name "_*" -or -newer while2 \) -type f -print

./elif3

./words.txt

./words2.txt

./_break

./_if

./set

./_shift

./_trap

./_unset

./ until

$

Это не слишком трудный пример, не так ли? Вы должны экранировать скобки, чтобы они не обрабатывались командной оболочкой, и заключить в кавычки символ

*
, чтобы он также был передан непосредственно в команду
find
.

Теперь, когда вы можете правильно искать файлы, рассмотрим действия, которые можно совершить, когда найден файл, соответствующий вашей спецификации. И снова в табл. 2.13 перечислены только самые популярные действия; полный список можно найти на страницах интерактивного справочного руководства.

Таблица 2.13

Действие Описание
– exec команда
Выполняет
команду
. Наиболее широко используемое действие. После табл. 2.13 приведено объяснение способа передачи параметров в команду. Это действие следует завершать символьной парой
\;
– ok команда
Подобно действию
exec
, за исключением того, что перед обработкой файлов
командой
выводится подсказка для получения подтверждения пользователя на обработку каждого файла. Это действие следует завершать символьной парой
\;
– print
Вывод на экран имени файла
– ls
Применение команды
ls -dils
к текущему файлу
Поделиться с друзьями: