Искусство программирования на языке сценариев командной оболочки
Шрифт:
bash$ find ~/ -name '*.txt'
/home/bozo/.kde/share/apps/karm/karmdata.txt
/home/bozo/misc/irmeyc.txt
/home/bozo/test-scripts/1.txt
find /home/bozo/projects -mtime 1
# Найти все файлы в каталоге /home/bozo/projects и вложенных подкаталогах,
#+ которые изменялись
#
# mtime = время последнего изменения файла
# ctime = время последнего изменения атрибутов файла (через 'chmod' или как-то иначе)
# atime = время последнего обращения к файлу
DIR=/home/bozo/junk_files
find "$DIR" -type f -atime +5 -exec rm {} \;
# Удалить все файлы в каталоге "/home/bozo/junk_files"
#+ к которым не было обращений в течение последних 5 дней.
#
# "-type filetype", где
# f = обычный файл
# d = каталог, и т.п.
# (Полный список ключей вы найдете в 'man find'.)
find /etc -exec grep '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' {} \;
# Поиск всех IP-адресов (xxx.xxx.xxx.xxx) в файлах каталога /etc.
# Однако эта команда выводит не только IP-адреса, как этого избежать?
# Примерно так:
find /etc -type f -exec cat '{}' \; | tr -c '.[:digit:]' '\n' \
| grep '^[^.][^.]*\.[^.][^.]*\.[^.][^.]*\.[^.][^.]*$'
# [:digit:] -- один из символьных классов
# введен в стандарт POSIX 1003.2.
# Спасибо S.C.
Пример 12-2. Badname, удаление файлов в текущем каталоге, имена которых содержат недопустимые символы и пробелы.
#!/bin/bash
# Удаление файлов в текущем каталоге, чьи имена содержат недопустимые символы.
for filename in *
do
badname=`echo "$filename" | sed -n /[\+\{\;\"\\\=\?~\(\)\<\>\&\*\|\$]/p`
#
rm $badname 2>/dev/null # Сообщения об ошибках "выстреливаются" в никуда.
done
# Теперь "позаботимся" о файлах, чьи имена содержат пробельные символы.
find .
– name "* *" -exec rm -f {} \;
# На место "{}", find подставит полное имя файла.
# Символ '\' указывает на то, что ';' интерпретируется как обычный символ, а не как конец команды.
exit 0
#---------------------------------------------------------------------
# Строки, приведенные ниже, не будут выполнены, т.к. выше стоит команда "exit".
# Альтернативный вариант сценария:
find .
– name '*[+{;"\\=?~<>&*|$ ]*' -exec rm -f '{}' \;
exit 0
# (Спасибо S.C.)
Пример 12-3. Удаление файла по его номеру inode
#!/bin/bash
# idelete.sh: Удаление файла по номеру inode.
# Этот прием используется в тех случаях, когда имя файла начинается с недопустимого символа,
#+ например, ? или -.
ARGCOUNT=1 # Имя файла должно быть передано в сценарий.
E_WRONGARGS=70
E_FILE_NOT_EXIST=71
E_CHANGED_MIND=72
if [ $# -ne "$ARGCOUNT" ]
then
echo "Порядок использования: `basename $0` filename"
exit $E_WRONGARGS
fi
if [ !
– e "$1" ]
then
echo "Файл \""$1"\" не найден."
exit $E_FILE_NOT_EXIST
fi
inum=`ls -i | grep "$1" | awk '{print $1}'`
# inum = номер inode (index node) файла