Литмир - Электронная Библиотека
Содержание  
A
A

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

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

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

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

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

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

$ <b>find . -newer while2 -print</b>

.

./elif3

./words.txt

./words2.txt

./_trap

$

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

-type f
.

$ <b>find . -newer while2 -type f -print</b>

./elif3

./words.txt

./words2.txt

./_trap

$

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

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

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

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

$ <b>find . \( -name &quot;_*&quot; -or -newer while2 \) -type f -print</b>

./elif3

./words.txt

./words2.txt

./_break

./_if

./set

./_shift

./_trap

./_unset

./ until

$

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

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

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

Таблица 2.13

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

Команда в аргументах

-exec
и
-ok
принимает последующие параметры в строке как собственные, пока не встретится последовательность
\;
В действительности команда, в аргументах
-exec
и
-ok
выполняет встроенную команду, поэтому встроенная команда должна завершиться экранированной точкой с запятой, для того чтобы команда
find
могла определить, когда ей следует продолжить поиск в командной строке аргументов, предназначенных для нее самой. Магическая строка
{}
— параметр специального типа для команд
-exec
и
-ok
, который заменяется полным путем к текущему файлу.

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

ls
:

$ <b>find . -newer while2 -type f -exec ls -l  {} \;</b>

-rwxr-xr-x 1 rick rick  275 Feb 8 17:07 ./elif3

-rwxr-xr-x 1 rick rick  336 Feb 8 16:52 ./words.txt

-rwxr-xr-x 1 rick rick 1274 Feb 8 16:52 ./words2.txt

-rwxr-xr-x 1 rick rick  504 Feb 8 18:43 ./_trap

$

Как видите, команда

find
чрезвычайно полезна; она только требует небольшой практики для умелого ее применения. И такая практика, как и эксперименты с командой
find
, обязательно принесет дивиденды.

Команда grep

Вторая очень полезная команда, заслуживающая рассмотрения, — это команда

grep
. Необычное имя, означающее общий синтаксический анализатор регулярных выражений (general regular expression parser). Вы применяете команду
find
для поиска файлов в вашей системе, а команду
grep
для поиска строк в ваших файлах. Действительно, очень часто при использовании команды
find
команда
grep
передается после аргумента
-exec
.

32
{"b":"285844","o":1}