Выбрать главу

Этот сценарий является модификацией Пример 12-15.

#! /bin/bash

#

# Очень простая утилита для переименования файлов

#

# Утилита "ren", автор Vladimir Lanin (lanin@csd2.nyu.edu),

#+ выполняет эти же действия много лучше.

ARGS=2

E_BADARGS=65

ONE=1 # Единственное или множественное число (см. ниже).

if [ $# -ne "$ARGS" ]

then

echo "Порядок использования: `basename $0` старый_шаблон новый_шаблон"

# Например: "rn gif jpg", поменяет расширения всех файлов в текущем каталоге с gif на jpg.

exit $E_BADARGS

fi

number=0 # Количество переименованных файлов.

for filename in *$1* # Проход по списку файлов в текущем каталоге.

do

if [ -f "$filename" ]

then

fname=`basename $filename` # Удалить путь к файлу из имени.

n=`echo $fname | sed -e "s/$1/$2/"` # Поменять старое имя на новое.

mv $fname $n # Переименовать.

let "number += 1"

fi

done

if [ "$number" -eq "$ONE" ] # Соблюдение правил грамматики.

then

echo "$number файл переименован."

else

echo "Переименовано файлов: $number."

fi

exit 0

# Упражнения:

# ----------

# С какими типами файлов этот сценарий не будет работать?

# Как это исправить?

#

# Переделайте сценарий таким образом, чтобы он мог обрабатывать все файлы в каталоге,

#+ в именах которых содержатся пробелы, заменяя пробелы символом подчеркивания.

Пример A-4. blank-rename: переименование файлов, чьи имена содержат пробелы

Это даже более простая версия предыдущего примера.

#! /bin/bash

# blank-rename.sh

#

# Заменяет пробелы символом подчеркивания в именах файлов в текущем каталоге.

ONE=1 # единственное или множественное число (см. ниже).

number=0 # Количество переименованных файлов.

FOUND=0 # Код завершения в случае успеха.

for filename in * # Перебор всех файлов в текущем каталоге.

do

echo "$filename" | grep -q " " # Проверить -- содержит ли имя файла

if [ $? -eq $FOUND ] #+ пробелы.

then

fname=$filename # Удалить путь из имени файла.

n=`echo $fname | sed -e "s/ /_/g"` # Заменить пробелы символом подчеркивания.

mv "$fname" "$n" # Переименование.

let "number += 1"

fi

done

if [ "$number" -eq "$ONE" ]

then

echo "$number файл переименован."

else

echo "Переименовано файлов: $number"

fi

exit 0

Пример A-5. encryptedpw: Передача файла на ftp-сервер, с использованием пароля

#!/bin/bash

# Модификация примера "ex72.sh", добавлено шифрование пароля.

# Обратите внимание: этот вариант все еще нельзя считать безопасным,

#+ поскольку в сеть пароль уходит в незашифрованном виде.

# Используйте "ssh", если вас это беспокоит.

E_BADARGS=65

if [ -z "$1" ]

then

echo "Порядок использования: `basename $0` имя_файла"

exit $E_BADARGS

fi

Username=bozo # Измените на свой.

pword=/home/bozo/secret/password_encrypted.file

# Файл, содержащий пароль в зашифрованном виде.

Filename=`basename $1` # Удалить путь из имени файла

Server="XXX"

Directory="YYY" # Подставьте фактические имя сервера и каталога.

Password=`cruft <$pword` # Расшифровка.

# Используется авторская программа "cruft",

#+ основанная на алгоритме "onetime pad",

#+ ее можно скачать с :

#+ Primary-site: ftp://ibiblio.org/pub/Linux/utils/file

#+ cruft-0.2.tar.gz [16k]

ftp -n $Server <<End-Of-Session

user $Username $Password

binary

bell

cd $Directory

put $Filename

bye

End-Of-Session

# ключ -n, команды "ftp", запрещает автоматический вход.

# "bell" -- звонок (звуковой сигнал) после передачи каждого файла.

exit 0

Пример A-6. copy-cd: Копирование компакт-дисков с данными

#!/bin/bash

# copy-cd.sh: copying a data CD

CDROM=/dev/cdrom # устройство CD ROM

OF=/home/bozo/projects/cdimage.iso # промежуточный файл

# /xxxx/xxxxxxx/ измените для своей системы.

BLOCKSIZE=2048

SPEED=2 # Можно задать более высокую скорость, если поддерживается.

echo; echo "Вставьте исходный CD, но *НЕ* монтируйте его."

echo "Нажмите ENTER, когда будете готовы. "

read ready # Ожидание.

echo; echo "Создается промежуточный файл $OF."

echo "Это может занять какое-то время. Пожалуйста подождите."

dd if=$CDROM of=$OF bs=$BLOCKSIZE # Копирование.

echo; echo "Выньте исходный CD."

echo "Вставьте чистую болванку CDR."

echo "Нажмите ENTER, когда будете готовы. "

read ready # Ожидание.

echo "Копируется файл $OF на болванку."

cdrecord -v -isosize speed=$SPEED dev=0,0 $OF

# Используется пакет Joerg Schilling -- "cdrecord" .

# http://www.fokus.gmd.de/nthp/employees/schilling/cdrecord.html

echo; echo "Копирование завершено."

echo "Желаете удалить промежуточный файл (y/n)? " # Наверняка большой файл получился.