Игнорирование скрытых файлов с помощью File :: Find - PullRequest
2 голосов
/ 05 июля 2011

Я использую file::find, чтобы просмотреть структуру каталогов и распечатать ее, но у меня возникают проблемы с исключением скрытых файлов. Вот что у меня пока так:

find(\&todo, $start_dir);
sub todo 
{
  if ($_ =~ /^./) 
  {
     print "hidden file $_\n";
  }
  else
  {
    if (-f $_) #check for file
    {
      file;
    }
    elsif (-d $_) #check for directory
    {
      directory($File::Find::dir);
    }
    else
    {
       print "ERROR: $_\n";
    }
  }
}        

Если я уберу проверку if ($_ =~ /^./), файлы и каталоги будут работать нормально, но при добавлении этой команды все печатается как скрытый файл. Как видите, мне нужно это только для работы на Unix. Кто-нибудь может указать мне правильное направление?

РЕДАКТИРОВАТЬ: я забыл обратный слеш перед. - должно быть, если ($ _ = ~ /^./), но есть ли в find () способ игнорирования скрытых файлов / каталогов по умолчанию? Спасибо!

Ответы [ 4 ]

8 голосов
/ 05 июля 2011

. в регулярном выражении соответствует любому символу; используйте \., чтобы соответствовать литералу .. И вам, вероятно, следует узнать о регулярных выражениях .

2 голосов
/ 05 июля 2011

См. Geekosaur для объяснения вашей проблемы. В простом случае, подобном этому, substr может быть лучшим вызовом, чем регулярное выражение:

if(substr($_, 0, 1) eq '.') {

Регулярные выражения - отличный инструмент, но они не должны быть единственными в вашем наборе инструментов.

1 голос
/ 16 мая 2013

Если вы используете Windows, модуль perl Win32 :: File сообщит вам, скрыт файл или нет.Win32 :: File по умолчанию устанавливается в ActivePerl.

К сожалению, Win32 :: File не содержит каких-либо примеров, (Я хотел бы, чтобы cpan добавил функцию комментариев на каждую страницу, например на сайт PHP. Конечноесть Annocpan, но этот дополнительный щелчок означает, что почти никто никогда не вносит в него свой вклад) , но этот поток поможет http://www.perlmonks.org/?node_id=194011

Есть также более приятный объектно-ориентированный Win32 :: File :: Object, но он работает только с файлами, если вы не примените этот патч :( https://rt.cpan.org/Public/Bug/Display.html?id=60735

Результаты кажутся странными, хотя большое количество файлов, за исключением случаев, когда вы скрыты или система оказывается обоими. Iсдался в конце и просто взломал это, чтобы игнорировать определенные папки:

if( $_ =~ /(RECYCLER)|(System Volume Information)/ ) {
    $File::Find::prune = 1;
}
1 голос
/ 05 июля 2011

/^./ - это регулярное выражение .Точка означает любой отдельный символ, поэтому вы говорите, что соответствует любой строке, начинающейся с любого символа , и в значительной степени соответствует всем именам файлов.

Вам необходимо поставить обратную косую чертуперед периодом или используйте \Q и '\ E'.\Q отключает сопоставление на метасимволах , что означает, что оно в основном удаляет всю магию и делает все простой старой строкой.В этом случае обратная косая черта была бы лучше, но вы можете представить, что пытаетесь сопоставить что-то более сложное, и \Q и \E будут работать лучше:

Любой из них будет работать:

 if ($_ =~ /^\./) 
 {
     print "hidden file $_\n";
 }


 if ($_ =~ /^\Q.\E/) 
 {
     print "hidden file $_\n";
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...