Искусство программирования на языке сценариев командной оболочки
Шрифт:
# Альтернативный вариант сценария:
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) файла
# Каждый файл имеет свой inode, где хранится информация о физическом расположении файла.
echo; echo -n "Вы совершенно уверены в том, что желаете удалить \"$1\" (y/n)? "
# Ключ '-v' в команде 'rm' тоже заставит команду вывести подобный запрос.
read answer
case "$answer" in
[nN]) echo "Передумали?"
exit $E_CHANGED_MIND
;;
*) echo "Удаление файла \"$1\".";;
esac
find .
– inum $inum -exec rm {} \;
echo "Файл "\"$1"\" удален!"
exit 0
Дополнительные примеры по использованию команды find вы найдете в Пример 12-22, Пример 3-4 и Пример 10-9. В страницах справочного ркуоводства (man find) вы найдете более подробную информацию об этой достаточно сложной и мощной команде.
xargs
Команда передачи аргументов указанной команде. Она разбивает поток аргументов на отдельные составляющие и поочередно передает их заданной команде для обработки. Эта команда может рассматриваться как мощная замена обратным одиничным кавычкам. Зачастую, когда команды, заключенные в обратные одиночные кавычки, завершаются с ошибкой too many arguments (слишком много аргументов), использование xargs позволяет обойти это ограничение. Обычно, xargs считывает список аргументов
со стандартного устройства ввода stdin или из канала (конвейера), но может считывать информацию и из файла.Если команда не задана, то по-умолчанию выполняется echo. При передаче аргументов по конвейеру, xargs допускает наличие пробельных символов и символов перевода строки, которые затем автоматически отбрасываются.
bash$ ls -l
total 0
– rw-rw-r-- 1 bozo bozo 0 Jan 29 23:58 file1
– rw-rw-r-- 1 bozo bozo 0 Jan 29 23:58 file2
bash$ ls -l | xargs
total 0 -rw-rw-r-- 1 bozo bozo 0 Jan 29 23:58 file1 -rw-rw-r-- 1 bozo bozo 0 Jan 29 23:58 file2
ls | xargs -p -l gzip– - упакует с помощью gzip все файлы в текущем каталоге, выводя запрос на подтверждение для каждого файла.
ls | xargs -n 8 echo– - выведет список файлов текущего каталога в 8 колонок.
find / -type f -print0 | xargs -0 grep -liwZ GUI | xargs -0 rm -f
grep -rliwZ GUI / | xargs -0 rm -f
Обе вышеприведенные команды удалят все файлы, содержащие в своем имени комбинацию символов "GUI". (Спасибо S.C.)
Пример 12-4. Использование команды xargs для мониторинга системного журнала
#!/bin/bash
# Создание временного файла мониторинга в текщем каталоге,
# куда переписываются несколько последних строк из /var/log/messages.
# Обратите внимание: если сценарий запускается обычным пользователем,
# то файл /var/log/messages должен быть доступен на чтение этому пользователю.
# #root chmod 644 /var/log/messages
LINES=5
( date; uname -a ) >>logfile
# Время и информация о системе
echo --------------------------------------------------------------------- >>logfile
tail -$LINES /var/log/messages | xargs | fmt -s >>logfile
echo >>logfile