Как запустить скрипт Perl для нескольких входных файлов с одинаковым расширением? - PullRequest
6 голосов
/ 11 ноября 2009

Как запустить скрипт Perl для нескольких входных файлов с одинаковым расширением?

 perl scriptname.pl file.aspx

Я хочу запустить его для всех файлов aspx в текущем каталоге

Спасибо!

Ответы [ 7 ]

7 голосов
/ 11 ноября 2009

В вашем Perl-файле

 my @files = <*.aspx>;
 for $file (@files) {

      # do something.

 }

<*.aspx> называется glob .

3 голосов
/ 11 ноября 2009

вы можете передать эти файлы в perl с подстановочным знаком

в вашем скрипте

foreach (@ARGV){
    print "file: $_\n";
    # open your file here...
       #..do something
    # close your file
}

в командной строке

$ perl myscript.pl *.aspx
2 голосов
/ 11 ноября 2009

Вы можете использовать glob в явном виде, чтобы использовать параметры оболочки без большой зависимости от поведения оболочки.

for my $file ( map {glob($_)} @ARGV ) { 
   print $file, "\n";
};

Возможно, вам придется контролировать возможность дублирования имени файла с расширением нескольких параметров.

1 голос
/ 11 ноября 2009

Если вы работаете на Linux, вы можете попробовать что-то вроде этого.

for i in `ls /tmp/*.aspx`; do perl scriptname.pl $i; done
0 голосов
/ 18 июля 2017

Например, для обработки perl scriptname.pl *.aspx *.asp

В Linux: оболочка расширяет символы подстановки, поэтому perl может быть просто

for (@ARGV) {
  operation($_); # do something with each file
}

Windows не расширяет символы подстановки, поэтому расширяйте символы подстановки в каждом аргументе в perl следующим образом Затем цикл for обрабатывает каждый файл так же, как указано выше

for (map {glob} @ARGV) {
  operation($_); # do something with each file
}

Например, распечатывается расширенный список под Windows

print "$_\n" for(map {glob} @ARGV);
0 голосов
/ 25 июня 2017

Для простого однострочного с -n или -p, вы хотите

perl -i~ -pe 's/foo/bar/' *.aspx

-i~ говорит, что нужно изменить каждый целевой файл на месте и оставить оригинал в качестве резервной копии с суффиксом ~, добавленным к имени файла. (Опустите суффикс, чтобы не оставлять резервную копию. Но если вы все еще учитесь или экспериментируете, это плохая идея; удаление резервных копий, когда вы закончите, - намного меньше хлопот, чем восстановление оригиналов из резервной копии, если вы что-то испортили. )

Если ваш Perl-код слишком сложен для однострочного (или просто достаточно полезен, чтобы его можно было многократно использовать), очевидно, замените -e '# your code here' на scriptname.pl ... хотя тогда может быть рефакторинг scriptname.pl, чтобы он принимал список аргументы имени файла и просто используйте scriptname.pl *.aspx, чтобы запустить его для всех файлов *.aspx в текущем каталоге.

Если вам нужно просмотреть структуру каталогов и найти все файлы с определенным шаблоном именования, полезна утилита find.

find . -name '*.aspx' -exec perl -pi~ -e 's/foo/bar/' {} +

Если ваш find не поддерживает -exec ... +, попробуйте с -exec ... \;, хотя это будет медленнее и запустит больше процессов (по одному на каждый файл, а не как можно меньше для обработки всех файлов).

Чтобы сканировать только некоторые каталоги, замените . (который называет текущий каталог) разделенным пробелами списком проверяемых каталогов или даже используйте find, чтобы найти сами каталоги (а затем, возможно, изучить * 1028). * для выполнения действий в каждом каталоге, который find выбирает с помощью вашего сложного, запутанного, критически важного для бизнеса, может быть, секретного списка предикатов find)

Может быть, также изучить find2perl, чтобы сделать эту рекурсию каталога изначально в Perl.

0 голосов
/ 11 ноября 2009

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

#!/usr/bin/perl -w

use strict;

my $path = shift;
my @files = split/\n/, `ls *.aspx`;

foreach my $file (@files) {
        do something...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...