ПРИМЕЧАНИЕ. Обычно ОС не позволяет вам изменить владельца файла или каталога, если вы не являетесь суперпользователем (т. е. root).
Теперь мы избавились от этого...
Модуль File::Find
делает то, что вы хотите. Используйте use warnings;
вместо -w
:
use strict;
use warnings;
use feature qw(say);
use autodie;
use File::Find;
finddepth sub {
return unless -d; # You want only directories...
chown deep, deep, $File::Find::name
or warn qq(Couldn't change ownership of "$File::Find::name\n");
}, ".";
Пакет File::Find
импортирует подпрограммы find
и finddepth
в вашу программу Perl.
Оба работают почти одинаково. Оба они глубоко рекурсивны в ваш каталог и оба принимают в качестве первого аргумента подпрограмму, которая используется для работы с найденными файлами, и список каталогов для работы.
Имя файла помещается в $_
, и вы попадаете в каталог этого файла. Это упрощает выполнение стандартных тестов для файла. Здесь я отвергаю все, что не является каталогом. Это одно из немногих мест, где я буду использовать $_
по умолчанию.
Полное имя файла (из каталога, который вы ищете, помещается в $File::Find::name
, а имя каталога этого файла — $File::Find::dir
.
Я предпочитаю помещать свою подпрограмму в свой find
, но вы также можете поместить туда ссылку на другую подпрограмму. Оба они более или менее эквивалентны:
my @directories;
find sub {
return unless -d;
push @directories, $File::Find::name;
}, ".";
my @directories;
find \&wanted, ".";
sub wanted {
return unless -d;
push @directories, $File::Find::name;
}
В обоих случаях я собираю имена всех каталогов на моем пути и помещаю их в @directories
. Мне нравится первый, потому что он объединяет мою подпрограмму wanted и мой find
. Кроме того, загадочно необъявленный @directories
в моей подпрограмме не выглядит таким уж загадочным и необъявленным. Я объявил my @directories;
прямо над find
.
Кстати, именно так я обычно использую find
. Я нахожу то, что хочу, и помещаю их в массив. В противном случае вы застрянете, помещая весь свой код в подпрограмму wanted.
person
David W.
schedule
20.12.2013