如何在Perl中使用Unix/AIX find命令和管道?

如何在Perl中使用Unix/AIX find命令和管道?,perl,shell,unix,pipe,aix,Perl,Shell,Unix,Pipe,Aix,我尝试使用管道传输到head命令的Unix/AIXfind命令返回目录中的第一个文件并将其分配给变量。但是,我的所有尝试都导致将查找返回的所有文件分配给变量,而不应用head命令 以下是我的三次尝试: Attempt 1: $first_file = `/usr/bin/find $my_path -type f -name $potential_file_names | head -n1`; Attempt 2: $first_file = `/usr/bin/find $

我尝试使用管道传输到head命令的Unix/AIXfind命令返回目录中的第一个文件并将其分配给变量。但是,我的所有尝试都导致将查找返回的所有文件分配给变量,而不应用head命令

以下是我的三次尝试:

Attempt 1: 
    $first_file = `/usr/bin/find $my_path -type f -name $potential_file_names | head -n1`;
Attempt 2: 
    $first_file = `/usr/bin/find $my_path -type f -name $potential_file_names '|' head -n1`;
Attempt 3:
    $first_file = `/usr/bin/find $my_path -type f -name $potential_file_names \\| head -n1`;
$potential\u file\u names
变量是一个带有通配符的字符串,用于返回目录中格式为“fileXXX.txt”的任何文件,其中“XXX”是三位数

$potential_file_names = 'file???.txt';
第一次尝试不起作用,因为Perl在返回错误“sh[2]:0403-057时似乎对管道产生了异常

首次尝试输出:

file001.txt
file002.txt
file003.txt
file004.txt
file005.txt
第二次和第三次尝试也失败。错误为“sh[2]:|:未找到”

第二次和第三次尝试的输出与第一次尝试相同

是否可以使用管道发送到head的find命令返回我正在搜索的目录中的第一个文件(在我的例子中是“file001.txt”

更新 我应该提到,文件名可能不以001开头,因此我需要最旧的文件。文件是按顺序创建的,因此使用find and piping to head-n1从脚本外部的命令行获取第一个文件。它必须是最旧的/第一个文件,因为我将在脚本中稍后使用循环删除文件,这是needs查找每个迭代的最早/第一个文件


谢谢。

试试这样:

    open EXE, qq{/usr/bin/find $my_path -type f -name $potential_file_names | head -n1}
                    or die qq{Error running command $!};
    my $file = <EXE>;
    close(EXE);
openexe,qq{/usr/bin/find$my_path-type f-name$potential_file_names|head-n1}
或死qq{运行命令$!}时出错;
我的$file=;
关闭(EXE);

尝试以下方法:

    open EXE, qq{/usr/bin/find $my_path -type f -name $potential_file_names | head -n1}
                    or die qq{Error running command $!};
    my $file = <EXE>;
    close(EXE);
openexe,qq{/usr/bin/find$my_path-type f-name$potential_file_names|head-n1}
或死qq{运行命令$!}时出错;
我的$file=;
关闭(EXE);

尝试以下方法:

    open EXE, qq{/usr/bin/find $my_path -type f -name $potential_file_names | head -n1}
                    or die qq{Error running command $!};
    my $file = <EXE>;
    close(EXE);
openexe,qq{/usr/bin/find$my_path-type f-name$potential_file_names|head-n1}
或死qq{运行命令$!}时出错;
我的$file=;
关闭(EXE);

尝试以下方法:

    open EXE, qq{/usr/bin/find $my_path -type f -name $potential_file_names | head -n1}
                    or die qq{Error running command $!};
    my $file = <EXE>;
    close(EXE);
openexe,qq{/usr/bin/find$my_path-type f-name$potential_file_names|head-n1}
或死qq{运行命令$!}时出错;
我的$file=;
关闭(EXE);

当存在纯Perl等价物时,避免使用
系统和反勾号;您的代码将更易于移植,并且您不必担心令人讨厌的shell引用问题

如果不关心子目录,可以使用获取特定目录中的文件列表:

#!/usr/bin/perl

use strict;
use warnings;

my $dir = 'foo';
opendir my $dh, $dir or die $!;

my @files = sort { -M "$dir/$b" <=> -M "$dir/$a" }
            grep { /^file\d{3}\.txt$/ && -f "$dir/$_" } readdir $dh;

closedir $dh;

print $files[0];
!/usr/bin/perl
严格使用;
使用警告;
my$dir='foo';
opendir my$dh、$dir或die$!;
my@files=sort{-M“$dir/$b”-M“$dir/$a”}
grep{/^file\d{3}\.txt$/&&f“$dir/$\}readdir$dh;
约$dh;
打印$files[0];
这将打印具有最早修改日期的文件名,尽管您当然可以使用


如果您还想在子目录内搜索,可以使用,这是一个核心模块:

use File::Find;
use File::Spec;

my @files;
my $dir = 'foo';
find(sub { push @files, $File::Find::name if /^file\d{3}\.txt$/ and -f $_; }, $dir);

my @sorted = sort { -M $b <=> -M $a } @files;

print $sorted[0];
使用File::Find;
使用File::Spec;
我的@文件;
my$dir='foo';
查找(子{push@files,$File::find::name if/^File\d{3}\.txt$/和-f$\},$dir);
my@sorted=sort{-M$b-M$a}@文件;
打印$sorted[0];

这将打印修改日期最早的文件路径。

当存在纯Perl等价物时,请避免使用
系统和反勾号;您的代码将更便于移植,并且不必担心严重的shell引用问题

如果不关心子目录,可以使用获取特定目录中的文件列表:

#!/usr/bin/perl

use strict;
use warnings;

my $dir = 'foo';
opendir my $dh, $dir or die $!;

my @files = sort { -M "$dir/$b" <=> -M "$dir/$a" }
            grep { /^file\d{3}\.txt$/ && -f "$dir/$_" } readdir $dh;

closedir $dh;

print $files[0];
!/usr/bin/perl
严格使用;
使用警告;
my$dir='foo';
opendir my$dh、$dir或die$!;
my@files=sort{-M“$dir/$b”-M“$dir/$a”}
grep{/^file\d{3}\.txt$/&&f“$dir/$\}readdir$dh;
约$dh;
打印$files[0];
这将打印具有最早修改日期的文件名,尽管您当然可以使用


如果您还想在子目录内搜索,可以使用,这是一个核心模块:

use File::Find;
use File::Spec;

my @files;
my $dir = 'foo';
find(sub { push @files, $File::Find::name if /^file\d{3}\.txt$/ and -f $_; }, $dir);

my @sorted = sort { -M $b <=> -M $a } @files;

print $sorted[0];
使用File::Find;
使用File::Spec;
我的@文件;
my$dir='foo';
查找(子{push@files,$File::find::name if/^File\d{3}\.txt$/和-f$\},$dir);
my@sorted=sort{-M$b-M$a}@文件;
打印$sorted[0];

这将打印修改日期最早的文件路径。

当存在纯Perl等价物时,请避免使用
系统和反勾号;您的代码将更便于移植,并且不必担心严重的shell引用问题

如果不关心子目录,可以使用获取特定目录中的文件列表:

#!/usr/bin/perl

use strict;
use warnings;

my $dir = 'foo';
opendir my $dh, $dir or die $!;

my @files = sort { -M "$dir/$b" <=> -M "$dir/$a" }
            grep { /^file\d{3}\.txt$/ && -f "$dir/$_" } readdir $dh;

closedir $dh;

print $files[0];
!/usr/bin/perl
严格使用;
使用警告;
my$dir='foo';
opendir my$dh、$dir或die$!;
my@files=sort{-M“$dir/$b”-M“$dir/$a”}
grep{/^file\d{3}\.txt$/&&f“$dir/$\}readdir$dh;
约$dh;
打印$files[0];
这将打印具有最早修改日期的文件名,尽管您当然可以使用


如果您还想在子目录内搜索,可以使用,这是一个核心模块:

use File::Find;
use File::Spec;

my @files;
my $dir = 'foo';
find(sub { push @files, $File::Find::name if /^file\d{3}\.txt$/ and -f $_; }, $dir);

my @sorted = sort { -M $b <=> -M $a } @files;

print $sorted[0];
使用File::Find;
使用File::Spec;
我的@文件;
my$dir='foo';
查找(子{push@files,$File::find::name if/^File\d{3}\.txt$/和-f$\},$dir);
my@sorted=sort{-M$b-M$a}@文件;
打印$sorted[0];

这将打印修改日期最早的文件路径。

当存在纯Perl等价物时,请避免使用
系统和反勾号;您的代码将更便于移植,并且不必担心严重的shell引用问题

如果不关心子目录,可以使用获取特定目录中的文件列表:

#!/usr/bin/perl

use strict;
use warnings;

my $dir = 'foo';
opendir my $dh, $dir or die $!;

my @files = sort { -M "$dir/$b" <=> -M "$dir/$a" }
            grep { /^file\d{3}\.txt$/ && -f "$dir/$_" } readdir $dh;

closedir $dh;

print $files[0];
!/usr/bin/perl
严格使用;
使用警告;
my$dir='foo';
opendir my$dh、$dir或die$!;
my@files=sort{-M”