Стандартная программа find умеет выводить оглавление директорий и всех их поддиректорий на всю глубину. Имена директорий указываются, как обычно, в командной строке. Эта программа умеет ещё много чего (для этого при её запуске предусмотрена масса ключей). Мы напишем свою, упрощённую версию этой программы (назовём её find.pl), и реализуем в ней главную функцию программы find — полный вывод всего содержимого директории на экран:
%
find /
/ /boot/vmlinuz-server /boot/config-2.6.31.12-server-2mnb /boot/kernel.h-2.6.31.12-server-2mnb /boot/grub/jfs_stage1_5 /boot/grub/menu.lst /boot/grub/iso9660_stage1_5 /boot/grub/vstafs_stage1_5 /boot/grub/xfs_stage1_5 /boot/grub/device.map /boot/grub/fat_stage1_5 /boot/grub/e2fs_stage1_5 /boot/grub/stage2 /boot/grub/install.sh /boot/grub/reiserfs_stage1_5 /boot/grub/minix_stage1_5 /boot/grub/install.sh.old /boot/grub/stage1 /boot/grub/menu.lst.old /boot/grub/device.map.old /boot/grub/ffs_stage1_5 /boot/grub/menu.lst.example /boot/grub/ufs2_stage1_5 /boot/System.map /boot/initrd-2.6.31.12-server-1mnb.img /boot/initrd-2.6.31.12-server-3mnb.img … /noah /noah/lost+found find: `/noah/lost+found': Отказано в доступе …
(здесь пропущено более 1200000 строк вывода — в нашем компьютере много файлов).
Поясним этот пример. Исследуя корневую директорию (/
), программа find нашла
директорию /boot
и углубилась в неё.
Там, помимо обычных файлов, нашлась поддиректория /boot/grub
. Программа вывела содержимое /boot/grub
. Спустя некоторое время программа
натолкнулась на директорию /noah
. Внутри
неё нет ничего, кроме поддиректории /noah/lost+found
, однако атрибуты доступа этой
директории и права пользователя, от имени которого запущена программа
find, не позволяют прочитать её оглавление. В таких случаях
выдаётся предупреждение, и такая директория пропускается, а программа
продолжает свою работу.
Параметры в командной строке должны обрабатываться по очереди. Позаботимся
также о том, чтобы в случае, когда в командной строке не указаны имена
директорий, наша программа работала бы с текущей директорией (как если бы
в командной строке была бы задана директория .
). Если среди параметров командной строки имеются
имена обычных файлов, они выводятся. Программа должна ругаться на
несуществующие файлы/директории:
%
find NoSuchFile.txt
find: `NoSuchFile.txt': Нет такого файла или каталога