Подстановка результата выполнения
Иногда возникает необходимость отыскать в системе файлы по некоему признаку и со всеми этими файлами выполнить одинаковое действие. Например, во всех файлах *.html заменить подстроку Siemens на Nixdorf. Если это требуется сделать только для файлов, лежащих в одном каталоге, то задача решается достаточно просто. Здесь мы приведем пример скрипта для Bourne Shell, но аналогичный скрипт легко написать и для других командных процессоров:
for i in *.html do sed 's/Siemens/Nixdorf/g' <$i >tmp mv tmp $i done
Переменная i последовательно принимает значения из списка, т.е. на каждой итерации цикла она имеет разное значение, список будет содержать имена всех файлов текущего каталога, соответствующих шаблону *.html.
Команда sed обеспечивает замену всех вхождений Siemens на Nixdorf, причем во входной поток sed перенаправляется содержимое очередного файла, в зависимости от значения переменной i. Результат направляется в файл tmp, а команда mv обеспечивает переименование файла tmp в нужное имя, для замены старого файла из списка *.html новым.
Что делать, если такую процедуру надо проделать со всеми файлами *.html всего дерева каталогов, начиная с текущего каталога?
В UNIX есть уникальная возможность, которая реализована в любом командном процессоре : можно "вложить" одну команду в другую так, чтобы вначале выполнилась одна, а затем результат ее выполнения был подставлен в командную строку для вызова второй команды.
Итак, мы хотим найти все файлы *.html в поддереве файловой системы, начиная с текущего каталога.
Используем find для поиска:
find . -name "*.html"
Теперь воспользуемся конструкцией "подстановка результата выполнения" и перепишем наш скрипт для замены подстрок:
for i in ` find . -name "*.html" ` do sed 's/Siemens/Nixdorf/g' <$i >tmp mv tmp $i done
Команда, заключенная в ` ` (обратные апострофы), выполняется первой, а результат ее выполнения подставляется в командную строку. Затем командная строка запускается на выполнение.