Чтение онлайн

ЖАНРЫ

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

Купер Мендель

Шрифт:

chmod 644 filename

# Выдает право на запись/чтение владельцу файла "filename", и право на чтение

# всем остальным

# (восьмеричное число).

chmod 1777 directory-name

# Выдает право на чтение, запись и исполнение файлов в каталоге,

# дополнительно устанавливает "sticky bit".

# Это означает, что удалять

файлы в этом каталоге могут только владельцы файлов,

# владелец каталога и, само собой разумеется, root.

chattr

Изменяет атрибуты файла. Эта команда подобна команде chmod, за исключением синтаксиса вызова, и работает исключительно в файловой системе ext2.

ln

Создает ссылку на существующий файл. Чаще всего используется с ключом – s, что означает символическую, или "мягкую" (symbolic или "soft") ссылку. Позволяет задавать несколько имен одному и тому же файлу и превосходная альтернатива "псевдонимам" (алиасам) (см. Пример 4-6).

ln -s oldfile newfile создает ссылку, с именем newfile, на существующий файл oldfile, .

man, info

Команды доступа к справочным и информационным страницам по системным командам и установленным программам и утилитам. Как правило, страницы info содержат более подробную информацию, чем man.

12.2. Более сложные команды

Команды для более опытных пользователей

find

– exec COMMAND \;

Для каждого найденного файла, соответствующего заданному шаблону поиска, выполняет команду COMMAND. Командная строка должна завершаться последовательностью символов \; (здесь символ ";" экранирован обратным слэшем, чтобы информировать командную оболочку о том, что символ ";" должен быть передан команде find как обычный символ). Если COMMAND содержит {}, то find подставляет полное имя найденного файла вместо "{}".

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.

Не следует путать опцию – exec команды find с внутренней командой Bash -- exec.

Пример 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".

Поделиться с друзьями: