Perl приходит на помощь
Лэптопы падают медленно. По крайней мере, это выглядело именно так, когда компьютер, с помощью которого я писал эту книгу, упал со стола на твердый деревянный пол. Когда я его поднял, он по-прежнему был цел и работал. Но в процессе проверки лэптопа на предмет наличия повреждений я заметил, что он начал работать все медленнее и медленнее. Мало того, время от времени он стал устрашающе гудеть и жужжать во время обращения к диску. Решив, что замедление было вызвано программной ошибкой, я выключил компьютер. Но выключаться корректно он отказывался. Это был плохой знак.
Еще хуже было нежелание компьютера загружаться. Он начинал процесс загрузки Windows NT, но затем выдавал ошибку «файл не найден» и замирал. Теперь стало ясно, что падение вызвало серьезное физическое повреждение жесткого диска. Вероятно, головки проскользнули по поверхности диска, уничтожив файлы и каталоги, находившиеся в открытом состоянии. Передо мной встал вопрос: «Остались ли неповрежденными хоть какие-то файлы? Выжили ли файлы этой книги!»
Первым делом я попытался загрузить Linux, другую операционную систему, установленную на портативном компьютере. Linux загрузился нормально; это меня подбодрило. Однако файлы этой книги находились в разделе NTFS, который не загружался. Используя драйвер NTFS для Linux, написанный Мартином фон Левисом (Martin von Lowis) и доступный на http://www.informatlk.hu-berlin.de/loewis/ntfs/ (теперь он поставляется вместе с ядрами Linux 2.2), я смонтировал раздел и обрадовался, увидев, что все мои файлы казались неповрежденными.
Мои попытки скопировать файлы из этого раздела проходили успешно, но лишь до тех пор, пока я не достиг некоторого файла. Диск опять издал этот зловещий звук, и скопировать файл не удалось. Было ясно. что если я хочу спасти свои данные, мне нужно пропустить все поврежденные файлы на диске. Программа, которой я пользовался (gnutar), могла пропустить список файлов. Вопрос был только в том, какие файлы следовало пропускать? Когда возникла эта неприятность, в файловой системе было больше шестнадцати тысяч файлов. Как я мог разобраться, какие файлы были повреждены, а какие нет? Запускать gnutar
снова и снова было отнюдь не лучшей стратегией. С такой задачей мог справиться Perl!
Позже в этой главе я покажу исходный код, которым пользовался для решения возникшей проблемы. Чтобы понять, как работает этот код, нам следует сначала познакомиться с файловыми системами вообще и, в частности, с тем, как мы работаем с ними в Perl.