-----------------------------------------------------
paths -l ll
ПОИСК ФАЙЛОВ
РАСПЕЧАТКА ФАЙЛОВОЙ ИНФОРМАЦИИ
2.1. ПОИСК ФАЙЛОВ
2.1.1. tree - визуализация файлового дерева
----------------------------------------------------
ИМЯ: TREE
----------------------------------------------------НАЗНАЧЕНИЕ
ФОРМАТ ВЫЗОВА
tree [dir]
ПРИМЕР ВЫЗОВА
$ tree $HOME
ТЕКСТ ПРОГРАММЫ
1 :
2 # @(#) tree v1.0 Visual display of a file tree Author: Russ Sage
2а вывод на экран структуры файлового дерева
3
4 if [ "$#" -gt 1 ]
5 then echo "tree: wrong arg count">&2
6 echo "usage: tree [dir]" >&2
7 exit 2
8 fi
9 if [ "$#" -eq 1 ]
10 then if [ ! -d $1 ]
11 then echo "$0: $1 not a directory">&2
12 echo "usage: tree [dir]" >&2
13 exit 2
14 fi
15 fi
16
17 find ${1:-.} -print | sort | sed -e "1p" -e "1d" \
18 -e "s|[^/]*/| /|g" \
19 -e "s|[^ */|/|" \
20 -e "s|/\([^/]*\)$|\1|"
ОПИСАНИЕ
ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ tree?
ЧТО ДЕЛАЕТ tree?
# find /tmp -print
/tmp
/tmp/a
/tmp/a/aa
/tmp/a/aa/file1
/tmp/b
/tmp/b/bb
/tmp/b/bb/file2
# tree /tmp
/tmp
/ a
/ / aa
/ / / file1
/ b
/ / bb
/ / / file2
ПРИМЕРЫ
ПОЯСНЕНИЯ
# what tree
и будет напечатано следующее сообщение:
tree:
2.1.2. thead - печать начала каждого файла
ИМЯ: thead
-----------------------------------------------------НАЗНАЧЕНИЕ
ФОРМАТ ВЫЗОВА
thead [dir...]ПРИМЕР ВЫЗОВА
$ find $HOME/src -name "*.c" -print | sort | theadТЕКСТ ПРОГРАММЫ
1 :
2 # @(#) thead v1.0 Prints head of files in tree Author: Russ Sage
2а Печатает заголовки файлов в дереве
3
4 if [ "`echo $1|cut -c1`" = "-" ]
5 then echo "$0: arg error"
6 echo "usage: $0 [dir ...]"
7 exit 1
8 fi
9
10 case $# in
11 0) while read FILE
12 do
13 if file $FILE | fgrep text >/dev/null 2>&1
14 then echo "\n:::::::::::::::::::::"
15 echo " $FILE"
16 echo "\n:::::::::::::::::::::"
17 head -15 $FILE
18 fi
19 done;;
20 *) for NAME in $*
21 do
22 find $NAME -type f -print | sort | wile read FILE
23 do
24 if file $FILE | fgrep text >/dev/null 2>&1
25 then echo "\n:::::::::::::::::::::"
26 echo " $FILE"
27 echo "\n:::::::::::::::::::::"
28 head -15 $FILE
29 fi
30 done
31 done;;
32 esac
ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ
FILE Содержит имя каждого файла
NAME Имя каталога, заданное в командной строке
ОПИСАНИЕ
ЗАЧЕМ НУЖЕН КОМАНДНЫЙ ФАЙЛ thead?
ЧТО ДЕЛАЕТ thead?
$ thead $HOME
$ find $HOME -name "*.c" -print | sort | thead
ПРИМЕРЫ
ПОЯСНЕНИЯ
КОМАНДА cut ДЛЯ BSD
for NAME in 'who | sed "s/^\([^ ]*\).*/\1/"'
do
done
ВОЗМОЖНЫЕ МОДИФИКАЦИИ
ВОЗМОЖНЫЕ ИССЛЕДОВАНИЯ
$ find $HOME -name "*.c" -print | thead
и
$ find $HOME -name "*.c" -exec head {} \;
2.1.3. tgrep - поиск строк в дереве файловой системы
--------------------------------------------------------------
ИМЯ: tgrep
--------------------------------------------------------------НАЗНАЧЕНИЕ
ФОРМАТ ВЫЗОВА
grep [-c|-h] string [file ...]ПРИМЕР ВЫЗОВА
# tgrep "profanity" /
ТЕКСТ ПРОГРАММЫ
1 :
2 # @(#) tgrep v1.0 Search for string in tree Author: Russ Sage
2а Поиск строки в дереве
3
4 OPT=""
5
6 for ARG in $@
7 do
8 if [ "`echo $ARG|cut -c1`" = "-" ]
9 then case $ARG in
10 -c) OPT="-name \"*.c\""
11 shift;;
12 -h) OPT="-name \"*.h\""
13 shift;;
14 *) echo "$O: incorrect argument" >&2
15 echo "usage: $O [-c|-h] string [file ...] >&2
16 exit 1;;
17 esac
18 fi
19 done
20
21 case $# in
22 0) echo "$O: argument error" >&2
23 echo "usage: $O [-c|-h] string [dir ...]" >&2
24 exit 2
25 ;;
26 1) while read FILE
27 do
28 grep -y "$1" $FILE /dev/nul
29 done
30 ;;
31 *) STRING=$1; shift
32 eval find "$@" -type f $OPT -print | sort | while read FILE
33 do
34 grep -y "$STRING" $FILE /dev/null
35 done
36 ;;
37 esac
ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ
FILE Содержит имя каждого файла
OPT Содержит специальные опции команды find
STRING Временная переменная, в которой содержится строка поиска
ОПИСАНИЕ
ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ tgrep?
ЧТО ДЕЛАЕТ tgrep?
ПРИМЕРЫ
ПОЯСНЕНИЯ
ВОЗМОЖНЫЕ ИССЛЕДОВАНИЯ
grep "$1" `find "$2" -print`
и
find "$2" -print | while read F
do
done
2.1.4. paths - нахождение пути доступа к исполняемым файлам, со специальными опциями
------------------------------------------------------------
ИМЯ: paths
------------------------------------------------------------НАЗНАЧЕНИЕ
ФОРМАТ ВЫЗОВА
paths [-l] [-s] file [file ...]ПРИМЕР ВЫЗОВА
$ paths -l ed ex vi
ТЕКСТ ПРОГРАММЫ
1 :
2 # @(#) paths v1.0 Path locator with special options Author: Russ Sage
2а Определитель местонахождения файлов со специальными опциями
3
4 FORMAT="path"
5
6 for ARG in $@
7 do
8 if [ '`echo $ARG | cut -c1`" = "-" ]
9 then case $ARG in
10 -l) FORMAT="ls"
11 shift;;
12 -s) FORMAT="set"
13 set "1";;
14 *) echo $0: arg error" >&2
15 echo "usage: $0 [-l] [-s] file [file ...]" >&2
16 exit 1;;
17 esac
18 fi
19 done
20
21 IFS="${IFS}:"
22
23 for FILE in $@
24 do
25 for DIR in $PATH
26 do
27 case $FORMAT in
28 path) if [ -f $DIR/$FILE ]
29 then echo $DIR/$FILE
30 fi;;
31 ls) if [ -f $DIR/$FILE ]
32 then ls -l $DIR/$FILE
33 fi;;
34 set) echo "\n:::::::::::::::::::"
35 echo "$DIR"
36 echo "::::::::::::::::::::"
37 ls -al $DIR | grep "^[^ ]*s[^ ]*";;
38 esac
39 done
40 done
ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ
ARG Содержит каждый аргумент командной строки
DIR Элемент с именем каталога в переменной PATH
FILE Содержит имя каждого файла в командной строке
FORMAT Тип требуемого формата выходных данных
IFS Переменная shell'а, разделитель полей
PATH Переменная shell'а, пути к каталогам исполняемых модулей
ОПИСАНИЕ
ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ paths?
-------------------------
|
| $ whatchamacallit
| sh: whatchamacallit: not found
|
|
IFS="${IFS}:" for FILE in $@ do
for DIR in $PATH
do
if [ -f $DIR/$FILE ]
then echo $DIR/$FILE
fi
done
done
PATH=.:/bin:/usr/bin:/etc/:$HOME/bin
то внутренний цикл выполнит пять итераций в таком порядке: ., /bin,
/usr/bin, /etc и, наконец, $HOME/bin. Если бы запрос имел вид "path
ll" для поиска утилиты, которую мы создадим позже в этой главе, то результат
мог бы выглядеть так:
---------------------------------------------
|
| /usr/bin/ll
| /usr/russ/bin/ll
|
|
Это значит, что команда ll была найдена в двух местах из вашего набора
маршрутов поиска.ЧТО ДЕЛАЕТ paths?
paths [-l] file
[file...]
как, например, в командах "paths ls who date"
или "paths -l ll". Для поиска файлов с установленным
пользовательским идентификатором (setuid files) не нужно
указывать имена файлов в командной строке. Вся команда должна
быть такой:
paths -s
ПРИМЕРЫ
/bin/ls
/usr/bin/more
/bin/who
/usr/russ/bin/paths
more /etc/gettydefs /etc/termcap
/usr/russ/bin/paths
с полными маршрутными именами каждого
файла. Этот пример показывает, как можно заставить команду paths
выполнять всю работу по поиску и показу файлов, которые вы хотите
увидеть. ПОЯСНЕНИЯ
ПРИЕМЫ ПРОФЕССИОНАЛЬНОЙ
РАБОТЫ В UNIX
аналогами. Опция ls есть дополнение,
которое сокращает объем работы при вызове. Наличие комбинации
поиска и команды ls освобождает того, кто вызывает этот командный
файл от необходимости применять команду подстановки. Старая и
новая команды выглядят примерно так:
ll `path ll`
-------------------------------
|
| -rws--x--x 1 root bin 16235 Sep 13 1985 /bin/su
|
|
ВОЗМОЖНЫЕ МОДИФИКАЦИИ
2.2.ВЫВОД ИНФОРМАЦИИ
2.2.1. lc - вывод файловой информации на экран по
столбцам
-------------------------------------------------------------
ИМЯ: lc
------------------------------------------------------------НАЗНАЧЕНИЕ
ФОРМАТ ВЫЗОВА
ПРИМЕР ВЫЗОВА
ТЕКСТ ПРОГРАММЫ
1 :
2 # @(#) lc v1.0 List files in a cOLumn Author: Russ Sage
2а Выводит список файлов в колоночном виде
3
4 if [ "$1" = "-m" ]
5 then MORE="| /usr/bin/more"
6 shift
7 else MORE=""
8 fi
9
10 eval "/bin/ls -a $@ | /bin/pr -5t" $MORE # pre System V
11 eval /bin/ls -aCF $@ $MORE # System V
ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ
MORE Содержит программный канал к команде more
ОПИСАНИЕ
ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ lc?
ЧТО ДЕЛАЕТ lc?
ПРИМЕРЫ
ПОЯСНЕНИЯ
--------------------------------
|
| ls: illegal option -- z
| usage: -1ACFRabcdfgilmnopqrstux [files]
|
2.2.2. ll - вывод файловой информации в длинном
формате
-------------------------------------------------------------
ИМЯ: ll
-------------------------------------------------------------НАЗНАЧЕНИЕ
ФОРМАТ ВЫЗОВА
ll [-m] [ls options] file [file...]
ПРИМЕР ВЫЗОВА
ll *.c
ТЕКСТ ПРОГРАММЫ
1 :
2 # @(#) ll v1.0 Long listing of files Author: Russ Sage
2а Выводит список файлов в длинном формате
3
4 if [ "$1" = "-m" ]
5 then MORE="| /usr/bin/more"
6 shift
7 else MORE=""
8 fi
9
10 eval /bin/ls -al $@ MORE
ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ
MORE Содержит строку передачи результатов по конвейеру команде more
ОПИСАНИЕ
ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ ll?
ЧТО ДЕЛАЕТ ll?
ПРИМЕРЫ
ПОЯСНЕНИЯ
2.2.3. kind - вывод однотипных файлов
-------------------------------------------------------------
ИМЯ: kind
-------------------------------------------------------------НАЗНАЧЕНИЕ
ФОРМАТ ВЫЗОВА
kind [-a] [-d] [-t] [-x] [file...]
ПРИМЕР ВЫЗОВА
more `kind /etc/*`
ТЕКСТ ПРОГРАММЫ
1 :
2 # @(#) kind v1.0 Prints files of the same kind Author: Russ Sage
2а Выводит список файлов определенного вида
3
4 if [ $# -gt 0 ]
5 then if [ `echo $1 | cut -c1` = "-" ]
6 then case #1 in
7 -a) KIND='archive'
8 shift;;
9 -d) KIND='data'
10 shift;;
11 -t) KIND='text'
12 shift;;
13 -x) KIND='executable'
14 shift;;
15 *) echo "kind: arg error" >&2
16 echo "usage: kind [-a] [-d] [-t] [-x] [file...]" >&2
17 echo " -a archive" >&2
18 echo " -d data" >&2
19 echo " -t text, default" >&2
20 echo " -x executable" >&2
21 echo " if no args, reads stdin" >&2
22 exit 1;;
23 esac
24 fi
25 fi
26
27 : ${KIND:='text'}
28
29 case $# in
30 0) while read FILE
31 do
32 file $FILE | fgrep $KIND | cut -d: -f1
33 done;;
34 *) file $@ | fgrep $KIND | cut -d: -f1;;
35 esac
ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ
FILE Содержит имена файлов по мере их чтения из stdin (стандартного ввода)
KIND Содержит строку, определяющую тип файла
ОПИСАНИЕ
ЗАЧЕМ НУЖЕН КОМАНДНЫЙ ФАЙЛ kind?
ЧТО ДЕЛАЕТ kind?
$ kind -d
/etc/* то вывод мог бы выглядеть так:
--------------------------------
|
| /etc/mnttab
| /etc/utmp
| /etc/wtmp
|
$ cd /etc
$ kind -d *
то при выводе убрался бы маршрут, использованный в вызывающей
последовательности, и напечаталось бы следующее:
-----------------------------------------------
|
| mnttab
| utmp
| wtmp
|
ПРИМЕРЫ
# find / -perm -0111 -exec ll {} \;
но опция perm в данном случае опять же проверяет биты прав доступа в
индексном дескрипторе файла, а не ищет магическое число в структуре
a.out, как описано ранее. Кстати, для того, чтобы вы могли успешно
запустить команду file (и тем самым kind) на системных файлах, вы
должны иметь права чтения, чтобы можно было прочитать магическое
число. ПОЯСНЕНИЯ
ВОЗМОЖНЫЕ МОДИФИКАЦИИ
2.2.4. m - простой доступ к команде more
-------------------------------------------------------------
ИМЯ: m
-------------------------------------------------------------НАЗНАЧЕНИЕ
ФОРМАТ ВЫЗОВА
m [more options] [file ...]ПРИМЕР ВЫЗОВА
m * Вывод командой more всех файлов текущего каталогаТЕКСТ ПРОГРАММЫ
1 :
2 # @(#) m v1.0 Easy access to more
2а Простой доступ к команде more
3
4 /usr/bin/more $@
ОПИСАНИЕ
ЗАЧЕМ НУЖЕН КОМАНДНЫЙ ФАЙЛ m?
ЧТО ДЕЛАЕТ m?
--------------------------
|
| m `path termcap` <-поиск таблицы описания тер-
| минала (termcap) и вывод
| . ее командой more
.
.
--More--(5%) <-строка состояния more
v vi /etc/termcap
vi +210 /etc/termcap <-командная строка для редак-
тора vi получена от more
.
.
:q <-выход из vi
--More--(5%) <-возврат в more
:!sh порождение нового shell'а
$ date запуск команды date
Wed Apr 23 07:15:04 PST 1986
$ ^d <-убрать порожденный shell
--More--(5%) <-возврат в more
:f распечатка имени файла,
выводимого командой more
"/etc/termcap" line 54 выход команды f
--More--(5%)
f <-команда more для пропуска
полного экрана
.skipping 23 lines
.
.
--More--(9%) <-пропуск и выдача текста
q выход из команды more
ПРИМЕРЫ
ПОЯСНЕНИЯ
:.!path more