Европейский Университет в Санкт-Петербурге
Опубликован: 10.10.2005 | Доступ: свободный | Студентов: 1716 / 298 | Оценка: 4.30 / 3.85 | Длительность: 16:22:00
ISBN: 978-5-94774-820-8
Лекция 10:

Командные процессоры

< Лекция 9 || Лекция 10: 123456789

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

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

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

Завершение имен файлов

Функция "подсказки" (можно сказать также - "завершения") имен файлов (file name completion) позволяет набрать только часть имени существующего файла и затем нажать клавишу "Tab". В ответ на это командный процессор "закончит" набор имени файла. Например, если надо обратиться к файлу /usr/sadm/admin/bin/printmgr, то достаточно набрать

/usr/sa<Tab>dm/a<Tab>dmin/b<Tab>in/pr<Tab>intmgr

Все, что в этом примере выделено жирным шрифтом, набираете вы, а все, что не выделено - подставляет командный процессор.

Завершение имен файлов реализовано только в bash и tcsh.

Тем, в чьей системе есть файлы с длинными уникальными именами, подсказка имен файлов отлично экономит время.

При двойном нажатии "Tab" выводятся все возможные варианты завершения имени файла.

Например, если в каталоге есть два файла, имена которых начинаются с букв msg: msg01.txt и msg02.txt и надо просмотреть один из них, можно набрать more msg<Tab><Tab>

Командный процессор bash (или tcsh ) подскажет:

msg01.txt 	 msg02.txt

Теперь достаточно набрать цифру 1 или 2, чтобы указать, какой именно файл требуется, и еще раз нажать "Tab" для окончательного завершения имени. Если после двойного нажатия "Tab" bash видит слишком много возможных вариантов имен, он спросит

There are 1102 possibilities. 
Do you really wish to see them all? (y or n)

Стоит ответить n: так много имен не уместится на экран.

< Лекция 9 || Лекция 10: 123456789