简体   繁体   English

为多个目录中的文件运行 perl 脚本

[英]Run perl script for files in multiple directories

I have multiple files (of the same name) in different subdirectories.我在不同的子目录中有多个文件(同名)。 I would like to run my perl script on all these files at once instead of have to do it individually.我想一次在所有这些文件上运行我的 perl 脚本,而不必单独执行。

For example I have the following file paths:例如,我有以下文件路径:

/Users/.../Documents/Results/DataSet1/Parameter1/Parameter2/data.dat
/Users/.../Documents/Results/DataSet2/Parameter1/Parameter2/data.dat
/Users/.../Documents/Results/DataSet3/Parameter1/Parameter2/data.dat
/Users/.../Documents/Results/DataSet4/Parameter1/Parameter2/data.dat
...

I want run my perl script on every data.dat file from the Results directory.我想在Results目录中的每个data.dat文件上运行我的 perl 脚本。 Side note: I am using a Mac and would like to run the script from terminal.旁注:我使用的是 Mac,想从终端运行脚本。 Right now to do each file individually I use perl myscript.pl *.dat for every folder.现在要单独处理每个文件,我对每个文件夹使用perl myscript.pl *.dat

一种解决方案是让 bash 为您完成工作。

for i in $(find /Users/.../Documents/Results -name data.dat); do (cd $(dirname $i); perl myscript.pl data.dat); done

You could use a combination of threads and glob with perl, like this:您可以将线程和 glob 与 perl 结合使用,如下所示:

use threads;

my $basepath = '/Users/.../Documents/Results';
my @files = glob qq("${basepath}/DataSet?/Parameter?/Parameter?/data.dat");

threads->create(\&processdata, $_) for @files;

sub processdata {
    my $file = shift;
    # do your processing here
}

This starts a distinct thread for each data.dat file found by the glob.这将为 glob 找到的每个 data.dat 文件启动一个不同的线程。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM