Организация UNIX-систем и ОС Solaris

Подстановка результата выполнения


Иногда возникает необходимость отыскать в системе файлы по некоему признаку и со всеми этими файлами выполнить одинаковое действие. Например, во всех файлах *.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

Команда, заключенная в ` ` (обратные апострофы), выполняется первой, а результат ее выполнения подставляется в командную строку. Затем командная строка запускается на выполнение.



Содержание раздела