Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операционные системы (2 семестр).docx
Скачиваний:
3
Добавлен:
12.11.2019
Размер:
193.38 Кб
Скачать

Приклад 2

Завдання Вивести назви всіх файлів у заданому каталозі, що мають однаковий перший рядок.

Формат застосування цієї команди повинен бути:

команда каталог...

Cкрипт названий ex7_2, його текст із докладними коментарями приводиться нижче.

#!/bin/bash2

# ============================================================== #

# Скрипт ex7_2: пошук співпадаючих перших рядків #

# ============================================================== #

# ========================================================

# Запам'ятовуємо поточний каталог

mydir=`pwd`

# ========================================================

# Параметри команди являють собою список каталогів.

# Наступним оператором організує цикл, який виконується до

# тих пор, поки залишаються неопрацьовані параметри.

while [ $# -ne 0 ]

do

# ======================================================

# Перехід у каталог, що задається 1-м параметром;

# діагностика направляється в тимчасовий файл

cd $1 2>$HOME/temp01

# ======================================================

# Перевірка - не чи порожній файл із діагностикою

if test -s $HOME/temp01

then

# ====================================================

# Якщо є діагностика - каталог недоступний

echo "Каталог $1 недоступний/не існує"

# ====================================================

# Перехід до наступного параметра

shift

# ====================================================

# Пропуск залишку тіла циклу

continue

fi

# ======================================================

# Ми ввійшли в заданий каталог

echo "Каталог: $1"

# ======================================================

# Вибираються файли розміром більше 0,

# список файлів направляється в потік

find -size +0c -type f |

# ======================================================

# Файли в списку виведені із вказівкою каталогу ./,

# від цих символів потрібно позбутися;

# результат записується в тимчасовий файл

sed 's/.\///' >$HOME/temp01

# ======================================================

# Цикл поки у файлі temp01 щось залишається

while test -s $HOME/temp01

do

# ====================================================

# Вибирається в змінну $f1 перший рядок з

# тимчасового файлу - ім'я чергового файлу

f1=`head -n1 $HOME/temp01`

# ====================================================

# Вибирається в змінну $s1 перший рядок з

# обраного файлу

s1=`head -n1 $f1`

# ====================================================

# $n - ознака того, що збіг рядків не знайдений

# $m - номер другого файлу зі списку

n="no"; m=2;

# ====================================================

# Нескінченний цикл - вихід по break

while [ 1 ]

do

# ==================================================

# Вибирається $ m-я рядок зі списку файлів - ім'я файлу

f2=`sed -n ''$m'p' $HOME/temp01`

# ==================================================

# Якщо обраний порожній рядок - список файлів закінчився

if [ "$f2" = "" ]; then

# ================================================

# у цьому випадку - вихід із циклу

break

# ================================================

# Кінець умови if [ "$f2" = "" ]

fi

# ==================================================

# Вибирається 1-я рядок із цього файлу

s2=`head -n1 $f2`

# ==================================================

# Рядок рівняється із запомненной раніше рядком з 1-го

# файлу в списку

if [ "$s1" = "$s2" ]; then

# ================================================

# Перевірка - чи були вже збігу

if [ "$n" = "no" ]; then

# ==============================================

# Якщо збігів не було - виводиться ім'я 1-го файлу зі списку

echo -n "$f1 "; n="yes"

# ==============================================

# Кінець умови if [ "$n" = "no" ]

fi

# ================================================

# Виводиться ім'я файлу, у якому знайдений збіг

echo -n "$f2 "

# ================================================

# Файлу, у якому знайдений збіг, віддаляється з файлу-списку

sed ''$m'd' $HOME/temp01 > $HOME/temp02

cat $HOME/temp02 >$HOME/temp01

# ================================================

# Кінець дій при збігу

else

# ================================================

# Якщо немає збігу - перехід до наступного файлу зі списку

m=`expr $m + 1`

# ================================================

# Кінець дій при відсутності збігу

fi

# ==================================================

# Кінець циклу перебору інших файлів списку

done

# ====================================================

# Якщо були знайдені збіги - виводиться текст загального рядка

if [ "$n" = "yes" ]; then

echo "- $s1"

fi

# ====================================================

# Видалення 1-й рядка зі списку імен файлів

sed '1d' $HOME/temp01 > $HOME/temp02

cat $HOME/temp02 >$HOME/temp01

# ====================================================

# Кінець циклу перебору імен файлів

done

# ======================================================

# Перехід до наступного параметра

shift

# ======================================================

# Кінець списку перебору параметрів

done

# ========================================================

# Видалення тимчасового файлу

rm $HOME/temp*

# ========================================================

# Повернення у вихідний каталог

cd "$mydir"

# ======== Кінець скрипта ex7_2 ================================= #

Зразок виконання створеної команди:

bash2-2.05$ ex7_2 ../ap10999 /home/metod

Каталог ../ap10999 недоступний/не існує

Каталог: /home/metod

Hum-Dum.txt H1 - Humpty-Dumpty

nikol_01 nikol_02 nikol_03 nikol_04 nikol_05 nikol_06 nikol_07 nikol_08 nikol_09

nikol_10 nikol_11 nikol_12 nikol_13 nikol_14 nikol_15 nikol_16 nikol_17 nikol_1

8 - Микола Олейников

bash2-2.05$