Приемы профессиональной работы в UNIX

       

текущий каталог, что равносильно команде


1. $ tree
Использует подразумеваемый каталог ( текущий каталог, что равносильно команде "$ tree .") в качестве начала файлового дерева.
2. $ tree /

Печатает древовидный листинг для КАЖДОГО файла всей системы. Команда find при таком ее запуске начинает с корневого каталога и выдает информацию о всех файлах системы.
3. $ tree $HOME/..
Показывает древовидный формат для всех других пользователей системы (предполагается, что все пользовательские каталоги находятся в одном и том же каталоге, например /usr/*).


1. $ thead /etc
Печатает данные из каждого текстового файла, находящегося в каталоге /etc. Очень полезная команда, так как большинство файлов в /etc являются исполняемыми модулями. Удобно иметь возможность быстро изолировать текстовые файлы.
2. $ thead /usr/include
Просматривает все подключаемые файлы (*.h), даже в системном подкаталоге sys.
3. $ find $HOME -ctime 0 -print | thead

Ищет все файлы в вашем регистрационном каталоге, которые были изменены в течении последних 24 часов. Для каждого файла проверяется, текстовый ли он. Если файл текстовый, то он печатается.




1. $ tgrep unix $HOME
Поиск любого вхождения слова unix во всех файлах моего регистрационного каталога.

2. $ tgrep -c "^sleep()$" $HOME/src
Поиск выражения (начало строки, символьная строка, конец строки) во всех исходных файлах на языке Си в регистрационном каталоге с исходными текстами (опция -c).
3. # find /usr/src -name "*.c" -print | tgrep "ioctl"
Поиск всех вызовов ioctl в исходных Си-файлах, начиная с каталога /usr/src. (Обратите внимание, что я являюсь суперпользователем. Это видно из того, что я занимаюсь поиском в ограниченной части системы, а именно в исходных дистрибутивах, а также из того, что в качестве символа приглашения используется символ "#".)
4. $ tgrep "| more" `find . -type f -print`
Поиск символа вертикальной черты (|), после которого следует слово more, в списке имен файлов, генерируемом оператором find. Find печатает имена всех файлов текущего каталога и всех подкаталогов, которые являются обычными файлами.
5. $ tgrep trap /bin /usr/bin /etc
Поиск команды прерывания (trap) во всех командных файлах интерпретатора shell, которые имеются в трех каталогах.


1. $ paths ls more who paths /bin/ls /usr/bin/more /bin/who /usr/russ/bin/paths
Поиск маршрутов к командам ls, more, who, paths. При выводе указываются полные абсолютные маршрутные имена. Обратите внимание, что в конце имени каждого файла печатается символ новой строки, чтобы получить распечатку, в которой каждое имя файла стоит в отдельной строке.
2. $ more `paths gettydefs termcap paths`
Если ваша переменная PATH содержит каталог /etc, то этот пример будет работать. Если нет, то первые два файла не будут найдены. Сначала запускается команда paths, и ее вывод помещается на свое место в командной строке команды more. Когда запускается команда more, она не знает, что ее аргументы получены от другой команды. После завершения работы команды paths команда more принимает вид:
more /etc/gettydefs /etc/termcap/usr/russ/bin/paths
с полными маршрутными именами каждого файла. Этот пример показывает, как можно заставить команду paths выполнять всю работу по поиску и показу файлов, которые вы хотите увидеть.
3. $ ll `paths ll`
В этом примере в длинном формате выводятся файлы с именами ll, которые найдет path. (Мы представим нашу версию команды ll несколько позже в этой же главе.) Как и в предыдущем случае, сначала генерируется информация о маршруте, затем она помещается в командную строку, а затем запускается команда ll.
4. $ m `paths paths`
В данном примере генерируется маршрутное имя самого командного файла paths и передается программе m, которая использует команду more для распечатки. (Командный файл m мы также покажем вам позже.)


1. $ lc `path lc`
Получает полное имя для lc и распечатывает файловую информацию в виде колонок.
2. $ lc -m -R /
Печатает колоночный список ВСЕХ файлов в системе, рекурсивно проходя вниз по иерархии системного дерева и пропуская распечатку через команду more.
Еще один маленький фокус: этот синтаксис был использован для создания другой команды, названной expose. Командная строка "lc -m -R $@" давала бы рекурсивный список всех файлов в любом каталоге по вашему выбору в приятном постраничном формате.
3. $ lc -m -R /usr/lib
Рекурсивно распечатывает список всех файлов во всех каталогах, начиная с /usr/lib, и пропускает листинг через команду more.
4. $ lc -m . | more
Выдает список файлов в текущем каталоге и пропускает листинг через команду more, а затем снова пропускает все через more. Работает ли это ? Никоим образом. Возникает полная путаница, и клавиша прерывания обычно является наилучшим способом выхода из данной ситуации.


1. $ ll /etc/*mount*
Выводит список всех файлов в каталоге /etc, имена которых содержат в каком-либо месте слово mount (например, mount, umount, unmountable).
2. $ ll -i `who|awk '{print "/dev/" $2}'`
Сперва выполняется команда who, затем результат ее работы по конвейеру передается команде awk, которая вырезает имя устройства и приписывает ему префикс /dev/. В результате список полных маршрутных имен ко всем терминальным устройствам, зарегистрированным в настоящий момент, помещается в командную строку команды ls -li. В распечатке указана вся информация об индексном дескрипторе файла (inode) для каждого терминального устройства.
3. $ ll `kind -a /lib`
Выводит в длинном формате список всех файлов архива в каталоге /lib. Этот каталог содержит библиотеки компиляторов всех языков системы UNIX. (Команда kind, которая отбирает файлы по их типу, рассматривается в следующем разделе.)
4. $ ll -m -i /dev
Выводит всю обычную информацию плюс номер индексного дескриптора для всех файлов в каталоге /dev. Выдача на экран происходит с помощью команды more.


1. $ od `kind -d /etc/*`
Выглядит так, как будто это должно работать, но команда od не работает с набором имен файлов. Она может обрабатывать только один файл в данный момент времени.
2. $ ll `sh -x kind -a /lib/*` | m
Это длинный пример. Выводит в длинном формате список всех файлов архивов, которые находятся в каталоге /lib. Мы запускаем shell в отладочном режиме выполнения, так что вы можете увидеть каждую командную строку перед ее выполнением. Результат по конвейеру передается команде more.
3. # find / -print | kind -x | while read FILE > do > ll $FILE > done > /tmp/filelist
Данный цикл обнаруживает все действительно исполняемые файлы. Для каждого из них выполняется команда "ls -l". Отметим, что здесь команда ll вызывается для каждого имени файла.
Вы могли бы выполнить ту же операцию при помощи такого оператора find:
find / -perm -0111 -exec ll {} \;
но опция perm в данном случае опять же проверяет биты прав доступа в индексном дескрипторе файла, а не ищет магическое число в структуре a.out, как описано ранее. Кстати, для того, чтобы вы могли успешно запустить команду file (и тем самым kind) на системных файлах, вы должны иметь права чтения, чтобы можно было прочитать магическое число.
4. $ for F in `kind /bin/* /usr/bin/* /etc/*` > do > fgrep "trap" $F /dev/null > done $ fgrep "trap" `kind /bin/* /usr/bin/* /etc/*`
$ find /bin /usr/bin/etc -exec fgrep "trap" {} \;
Это три различных способа поиска слова "trap" во всех текстовых файлах.


1. $ ll -R / | m
Начиная с корневого каталога (/), вывести в длинном формате (ll) все файлы (опция -a подразумевается в ll) всей системы (-R) и постранично распечатать на экран (| m).
2. $ m `path inittab rc passwd`
Обнаружить и вывести с помощью more системные файлы inittab, rc и passwd. Неприятность здесь заключается в том, что данный маршрут скорее всего относится к каталогу /bin/passwd, а не /etc/passwd (поскольку каталог /etc размещается в конце каталогов), а это означает, что вы можете попытаться вывести на экран исполняемый файл. В зависимости от того, какую из версий команды more вы запустили, это может привести к чему угодно начиная с сообщения команды more о том, что это был не текстовый файл, и заканчивая тем, что ваш терминал начнет показывать непонятные символы и даже зависнет.


1. $ mmm nroffile | m
Запуск команды nroff применительно к файлу nroffile, вывод результата на экран с передачей по конвейеру команде more. Это полезно при изучении утилиты nroff, проведении экспериментов с различными командами и наблюдения за соответствующими результатами.
2. $ for F in proj.? do mmm $F > $F.rf done
Обработка в цикле всех файлов, имена которых содержат символьную строку "proj.", за которой следует один символ. Это могут быть proj.1, proj.2 и так далее по всему набору символов вплоть до proj.z, proj.{, proj.|, proj.} и proj.~, если считать, что у вас есть файлы, имена которых содержат эти символы. Каждый файл обрабатывается, и выход nroff перенаправляется в файл с таким же именем, дополненным символами .rf.
3. $ mmm status[12] | lpr -o5
Обработка командой nroff файлов status1 и status2. Выход в стандартный вывод передается по конвейеру программе lpr. Программа lpr является фильтром и принимает или имена файлов в командной строке, или непосредственно данные, передаваемые ей по конвейеру (но не то и другое сразу). Опция -o5 указывает lpr сместить страницу на 5 символов.


1. $ pall /usr/include
Выводит ВСЕ файлы заголовков. Сюда включаются файлы заголовков в подкаталоге sys и во всех других каталогах, которые могут располагаться ниже каталога /usr/include. Это и есть причина, по которой был написан командный файл pall. Он создает один огромный листинг всех файлов заголовков в отсортированном порядке с печатью в заголовке страниц полного имени.
2. $ pall $HOME/src
Обходит все каталоги, находящиеся ниже каталога исходных текстов, и распечатывает все файлы.

Содержание раздела