Теперь найдем файлы с именами, начинающимися с символа подчеркивания или измененные позже, чем файл 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к текущему файлу |
Команда в аргументах -execи -okпринимает последующие параметры в строке как собственные, пока не встретится последовательность \;В действительности команда, в аргументах -execи -okвыполняет встроенную команду, поэтому встроенная команда должна завершиться экранированной точкой с запятой, для того чтобы команда findмогла определить, когда ей следует продолжить поиск в командной строке аргументов, предназначенных для нее самой. Магическая строка {}— параметр специального типа для команд -execи -ok, который заменяется полным путем к текущему файлу.
Объяснение, возможно, не слишком легкое для понимания, поэтому рассмотрим пример, который поможет внести ясность. Взгляните на простой пример, использующий хорошую безопасную команду ls:
$ find . -newer while2 -type f -exec ls -l {} \;
-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.
Команда grepпринимает опции, шаблон соответствия и файлы для поиска:
grep[ опции ] шаблон [ файлы ]
Если имена файлов не заданы, команда анализирует стандартный ввод.
Давайте начнем с изучения основных опций команды grep. И на этот раз в табл. 2.14 приведены только самые важные из них; полный список см. на страницах интерактивного справочного руководства.
Таблица 2.14
| Опция |
Описание |
-с |
Вместо вывода на экран совпавших с шаблоном строк выводит их количество |
-E |
Включает расширенные регулярные выражения |
-h |
Ужимает обычное начало каждой строки вывода за счет удаления имени файла, в котором строка найдена |
-i |
Не учитывает регистр букв |
-l |
Перечисляет имена файлов со строками, совпадающими с шаблоном; не выводит сами найденные строки |
-v |
Меняет шаблон соответствия для выбора вместо строк, соответствующих шаблону, несовпадающих с ним строк |
Выполните упражнение 2.17.
Читать дальше