Как вызвать скрипт в подпапках - PullRequest
0 голосов
/ 07 сентября 2010

У меня есть скрипт, который я использую для удаления повторяющихся записей календаря. Корневая почтовая папка содержит папки, в которых каждая папка имеет имя_имя_последнего имени, затем под друг другом находится / Календарь / # msgs /.

На данный момент я запускаю скрипт вручную, зайдя в папку пользователей и запустив скрипт /Users/Documents/duplicates/dups.pl. --killdups`

Есть ли способ, которым я мог бы легко сделать так, чтобы он просматривал все почтовые папки пользователей и смотрел в соответствующую папку / Calendar / # msgs / и запускал скрипт?

Ответы [ 3 ]

1 голос
/ 08 сентября 2010

Это можно сделать несколькими способами, в зависимости от того, что вы хотите сделать.

Во-первых, вы можете выполнить поиск сценариев в каждой папке в своем начальном каталоге.Вы ничего не указываете в командной строке.

 use File::Spec::Functions qw(catfile);

 my @users = glob( '/Users/*' );
 foreach my $user ( @users ) {   # $user looks like /Users/Buster
      my $calendar_dir = catfile( $user, 'Calendar', '#msgs' );
      ...
      }

Вы также можете использовать opendir , чтобы получить список пользователей, чтобы вы возвращались по одному каталогу за раз:

 opendir my $dh, '/Users' or die ...;
 while( my $user = readdir $dh ) {
     next if $user =~ /^\.\.?\z/; # and anything else you want to skip
     ... # do the cool stuff
     }

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

 dups.pl --killdups Buster Mimi Roscoe 

Чтобы просмотреть всех пользователей, может быть что-то вроде этого (похоже, что вы работаете в MacOS X,но не совсем, поэтому я не уверен, какой путь вам нужен), используя глобус командной строки:

 dups.pl --killdups /Users/*

Решение выглядит аналогично, но вы берете пользователей из @ARGV вместо использованияglob:

 foreach my $user ( @ARGV ) {
      ...
      }

Этого должно быть достаточно, чтобы начать работу.Вы должны будете интегрировать это с остальной частью вашего сценария и исправить пути в каждом случае, чтобы это было то, что вам нужно, но это всего лишь простое манипулирование строками (или даже проще, чем с File :: Spec .

0 голосов
/ 07 сентября 2010

Редактировать: Может быть, вы предпочитаете элегантное решение Perl?

#!/usr/bin/perl -w
# CC-by Cedric 'levif' Le Dillau.

use File::Find;

@ARGV = qw(.) unless @ARGV;
find sub { apply_to_folder($File::Find::name) if -d }, @ARGV;

sub apply_to_folder {
    my $folder = shift;
    printf "folder: %s\n", $folder;
}

Тогда ваша apply_to_folder() функция может быть любой, какой вы захотите.

Обратите внимание, что замена -d на -f или -f && -x может изменить функцию фильтрации.(справку можно найти по perldoc -f -X)

Более старое предложение было:

Попробуйте использовать:

$ find "/Calendar/#msgs/" -type d -exec dups.pl "{}" --killdups \;

Или perl's opendir() /readdir() функций:

$ perldoc -f opendir
0 голосов
/ 07 сентября 2010

Перейдите в папки, которые он должен смотреть в командной строке.Аргументы будут в @ARGV, вы просто зацикливаетесь на нем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...