Книга: Искусство программирования на языке сценариев командной оболочки

Пример 12-3. Удаление файла по его номеру inode

Пример 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 все файлы в текущем каталоге, выводя запрос на подтверждение для каждого файла.


xargs имеет очень любопытный ключ -n NN, который ограничивает количество передаваемых аргументов за один "присест" числом NN.

ls | xargs -n 8 echo -- выведет список файлов текущего каталога в 8 колонок.


Еще одна полезная опция -- -0, в комбинации с find -print0 или grep -lZ позволяет обрабатывать аргументы, содержащие пробелы и кавычки.

find / -type f -print0 | xargs -0 grep -liwZ GUI | xargs -0 rm -f

grep -rliwZ GUI / | xargs -0 rm -f

Обе вышеприведенные команды удалят все файлы, содержащие в своем имени комбинацию символов "GUI". (Спасибо S.C.)

Оглавление книги


Генерация: 1.186. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз