ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
9.10. Деление имени файла на компонентыПроблемаИмеется строка, содержащая полное имя файла. Из нее необходимо извлечь компоненты (имя, каталог, расширение (-я)).РешениеВоспользуйтесь функциями стандартного модуля File::Basename.use File::Basename;
КомментарийФункции деления имени файла присутствуют в стандартном модуле File::Basename. Функции dirname и basename возвращают соответственно каталог и имя файла:$path = '/usr/lib/libc.a';
Расширение можно получить следующим образом: sub extension {
Для файла source.c.bak вместо простого "bak" будет возвращено расширение "с. bak". Если вы хотите получить именно "bak", в качестве второго аргумента fileparse используйте ' \.. *?'. Если передаваемое полное имя заканчивается разделителем каталогов (например, lib/), fileparse считает, что имя каталога равно "lib/", тогда как dirname считает его равным ".". > Смотри также -------------------------------- Описание переменной $"0 в perlvar(1); документация по стандартному модулю File::Basename. 9.11. Программа: symirrorПрограмма из примера 9.6 рекурсивно воспроизводит каталог со всем содержимым и создает множество символических ссылок, указывающих на исходи ьи файлы. Пример 9.6. symirror#!/usr/bin/perl -w # symirror - дублирование каталога с помощью символических ссылок use strict; use File::Find; use Cwd; my ($srcdir, $dstdir); my $cwd = getcwd(); die "usage: $0 realdir mirrordir" unless @ARGV == 2; for (($srcdir, $dstdir) = @ARGV) { my $is_dir = -d; next if $is_dir; # Нормально vif (defined ($is_dir)) { die "$0: $_ is not a directory\n"; } else { # Создать каталог mkdir($dstdir, 07777) or die "can't mkdir $dstdir: $!"; } } continue { sft"(?!/)#$cwd/#; # Исправить относительные пути } chdir $srcdir; find(\&wanted, '.'); sub wanted { my($dev, $ino, $mode) = lstat($_); my $name = $File::Find::name; $mode &= 07777; # Сохранить права доступа $name =" s!"\./!!; # Правильное имя if (-d _) { # Затем создать каталог mkdir("$dstdir/$name", $mode) or die "can't mkdir $dstdir/$name: $!"; } else { Продублировать все остальное symlink("$srcdir/$name", v"$dstdir/$name") or die "can't symlink $srcdir/$name to $dstdir/$name: $! } } 9.12. Программа: 1stВам не приходилось отбирать из каталога самые большие или созданные последними файлы? В стандартной программе Is предусмотрены параметры для сортировки содержимого каталогов по времени (флаг -t) и для рекурсивного просмотра подкаталогов (флаг -R). Однако Is делает паузу для каждого каталога и выводит только его содержимое. Программа не просматривает все подкаталоги, чтобы потом отсортировать найденные файлы. Следующая программа 1st справляется с этой задачей. Ниже показан пример подробного вывода, полученного с использованием флага -1:% 1st -1 /etc 12695 0600 1 root wheel 512 Fri May 29 10:42:41 1998 /etc/ssh_random_seed 12640 0644 1 root wheel 10104 Mon Hay 25 7:39:19 1998 /etc/ld.so.cache 12626 0664 1 root wheel 12288 Sun May 24 19:23:08 1998 /etc/psdevtab 12304 0644 1 root root 237 Sun May 24 13:59:33 1998 /etc/exports 12309 0644 1 root root 3386 Sun May 24 13:24:33 1998 /etc/inetd.conf 12399 0644 1 root root 30205 Sun May 24 10:08:37 1998 /etc/sendmail.cf 18774 0644 1 gnat perldoc 2199 Sun May 24 9:35:57 1998 /etc/Xn/XMetroconfig 12636 0644 1 root wheel 290 Sun May 24 9:05:40 1998 /etc/mtab 12627 0640 1 root root 0 Sun May 24 8:24:31 1998 /etc/wtmplock 12310 0644 1 root tchrist 65 Sun May 24 8:23:04 1998 /etc/issue Файл /etc/X11/XMetroconfig оказался посреди содержимого /etc, поскольку листинг относится не только к /etc, но и ко всему, что находится внутри каталога. К числу поддерживаемых параметров также относится сортировка по времени последнего чтения вместо записи (-и) и сортировка по размеру вместо времени (-s). Флаг -i приводит к получению списка имен из стандартного ввода вместо рекурсивного просмотра каталога функцией find. Если у вас уже есть готовый список имен, его можно передать 1st для сортировки. Исходный текст программы приведен в примере 9.7. Пример 9.7. 1st #!/usr/bin/perl
|