使用File :: Find,如何将参数传递给处理每个文件的函数?
我有一个遍历目录的Perl脚本,以便将一些3通道TIFF文件转换为JPEG文件(每个TIFF文件3个JPEG文件).这有效,但我想将一些参数传递给处理每个文件的函数(不使用全局变量).
以下是我尝试传递参数的脚本的相关部分:
use File::Find;
sub findFiles
{
my $IsDryRun2 = ${$_[0]}{anInIsDryRun2};
}
find ( { wanted => \&findFiles, anInIsDryRun2 => $isDryRun }, $startDir);
Run Code Online (Sandbox Code Playgroud)
$isDryRun
是一个标量.$startDir
是一个字符串,一个目录的完整路径.
$IsDryRun2
未设置:
在连接(.)中使用未初始化的值$ IsDryRun2或在TIFFconvert.pl第197行(#1)使用字符串(未初始化)使用未定义的值,就像它已经定义一样.它被解释为""或0,但也许这是一个错误.要禁止此警告,请为变量分配定义的值.
(旧的呼叫不带参数为:find ( \&findFiles, $startDir);
)
测试平台(但是生产主页将是Linux机器,Ubuntu 9.1,Perl 5.10,64位):ActiveState Perl 64位.Windows XP.从perl -v:v5.10.0构建,用于MSWin32-x64-多线程二进制构建1004 [287188]由ActiveState提供.
我写过以下perl脚本,但问题是它总是在其他部分,并报告不是文件.我在输入的目录中有文件.我在这做错了什么?
我的要求是以递归方式访问目录中的每个文件,打开它并以字符串形式读取它.但逻辑的第一部分是失败的.
#!/usr/bin/perl -w
use strict;
use warnings;
use File::Find;
my (@dir) = @ARGV;
find(\&process_file,@dir);
sub process_file {
#print $File::Find::name."\n";
my $filename = $File::Find::name;
if( -f $filename) {
print " This is a file :$filename \n";
} else {
print " This is not file :$filename \n";
}
}
Run Code Online (Sandbox Code Playgroud) 可以像这样使用Perl的File :: Find模块:
find( \&wanted, @directories);
Run Code Online (Sandbox Code Playgroud)
我们如何在wanted
函数中添加参数?
例如,我想在/tmp
从每个文件中提取一些信息时遍历文件,结果应存储到不同的目录中.输出目录应作为参数给出.
我File::Find::Rule
在Strawberry Perl Windows上使用.
当我运行以下代码时:
@files = File::Find::Rule->file()
->in( $dir );
foreach my $file (@files){
say $file;
}
Run Code Online (Sandbox Code Playgroud)
我得到这种格式的文件列表:
C:\data\mydata\file/1.xls
Run Code Online (Sandbox Code Playgroud)
而不是这种格式:
C:\data\mydata\file\1.xls
Run Code Online (Sandbox Code Playgroud)
可能是什么问题呢?
我正在使用该File::Find
模块遍历目录树.找到特定文件后,我想停止搜索.我怎样才能做到这一点?
find (\$processFile, $mydir);
sub processFile() {
if ($_ =~ /target/) {
# How can I return from find here?
}
}
Run Code Online (Sandbox Code Playgroud) 我在下面的代码中使用File :: Find来查找/home/user/data
路径中的文件.
use File::Find;
my $path = "/home/user/data";
chdir($path);
my @files;
find(\&d, "$path");
foreach my $file (@files) {
print "$file\n";
}
sub d {
-f and -r and push @files, $File::Find::name;
}
Run Code Online (Sandbox Code Playgroud)
当我将dir路径更改为我需要搜索文件的路径时,但它仍然为我提供了完整路径的文件.即
/home/user/data/dir1/file1
/home/user/data/dir2/file2
and so on...
Run Code Online (Sandbox Code Playgroud)
但我希望输出像
dir1/file1
dir2/file2
and so on...
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议我找到文件的代码,只显示当前的工作目录?
我有一个监控摄像头,它根据我给定的条件拍摄图像.图像保存在我的Linux上.图像命名惯例如下 -
CAPTURE04.YYYYMMDDHHMMSS.jpg
Run Code Online (Sandbox Code Playgroud)
该目录包含以下文件 -
CAPTURE04.20171020080501.jpg
CAPTURE04.20171021101309.jpg
CAPTURE04.20171021101913.jpg
CAPTURE04.20171021102517.jpg
CAPTURE04.20171021103422.jpg
CAPTURE04.20171022103909.jpg
CAPTURE04.20171022104512.jpg
CAPTURE04.20171022105604.jpg
CAPTURE04.20171022110101.jpg
CAPTURE04.20171022112513.jpg ... and so on.
Run Code Online (Sandbox Code Playgroud)
但是,实际上,现在我正在尝试使用terminal命令找到一种在特定日期时间(文件名)范围之间获取所有文件的方法. 注意:需要遵循文件名(YYYYMMDDHHMMSS),而不是文件创建/修改时间.
比如我需要获取文件名在2017-10-20 08:30:00和2017-10-22 09:30:00之间的所有文件
我正在尝试搜索谷歌并得到以下命令 -
find -type f -newermt "2017-10-20 08:30:00" \! -newermt "2017-10-22 09:30:00" -name '*.jpg'
Run Code Online (Sandbox Code Playgroud)
它返回在给定日期范围内创建/修改的文件.但我需要根据给定的文件名范围查找文件.所以我认为这对我的情况不起作用.
也尝试使用以下命令 -
find . -maxdepth 1 -size +1c -type f \( -name 'CAPTURE04.20171020083000*.jpg' -o -name 'CAPTURE04.2017102209300*.jpg' \) | sort -n
Run Code Online (Sandbox Code Playgroud)
这不起作用.. :(
请帮我写下实际的命令.提前致谢.
我在数组中有一组目录
chdir /tmp;
my @dir=("test" "abc" "def")
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法使用File :: Find :: Rule以递归方式查找/ tmp中的所有文件,但不包括@dir中的文件.
我可以从@dir获取所有文件
my $rule = File::Find::Rule->new;
$rule->file;
my @files = $rule->in( @dir );
Run Code Online (Sandbox Code Playgroud)
但我无法否定条件,即排除@dir.我在努力
chdir /tmp;
@files = File::Find::Rule->new
->file()
->name(@dir)
->prune
->in( "." );
Run Code Online (Sandbox Code Playgroud)
但没有输出.
我想(通过使用File :: Find)首先列出当前目录中的所有文件,然后跳转到子目录.可能吗?
我希望能够将Perl限制File::Find
到目录深度(在指定搜索下面)到指定目录以及它下面的1和2子目录.
我希望能够同时枚举文件,如果可能的话.
它必须与绝对路径一起工作.