【发布时间】:2023-03-31 20:09:02
【问题描述】:
我想在目录中第一次出现匹配某种模式的文件。这是我正在使用的命令。
ls my/file/path/pattern* | awk '{print $1}'
我的目录是否应该包含文件 pattern1、pattern2、pattern3 等... 这个命令只会返回 pattern1。这在终端窗口中按预期工作。
它在 perl 脚本中失败。我的命令是
push @arr, `ls path/to/my/dir/pattern* | awk \'{print \$1}\'`;
print @arr;
这里的输出是
pattern1
pattern2
pattern3
我希望输出仅为模式 1。为什么 ls 的全部输出都转储到数组中?
编辑:我找到了一种解决方法
my $temp = (`ls path/to/my/dir/pattern* | awk \'{print \$1}\'`)[0];
但我仍然很好奇为什么其他方式行不通。
编辑:有几个评论者说我的终端命令不像我描述的那样工作,所以这是一个屏幕截图。我知道 awk 返回每一行的第一列,但如果只有几个文件匹配,它应该可以像我描述的那样工作。
【问题讨论】:
-
my $dir = glob '/path/to/glob*';(虽然你所说的“第一个”是什么意思?按某种排序顺序排列第一个,或者任何随机结果都会这样做?) -
我从您的第一个示例中得到
pattern1 pattern2 pattern3(每个示例都在 1 行)。哈哈,perl 内部的awk一定会让 perl 变得疯狂;-!perl支持print[f]和$1等符号。祝你好运。 -
我不认为 awk 命令会给出你所说的结果。
-
@shellter 我总是惊讶于我们看到有多少问题询问如何修复从 perl 或 python 对 awk 或 sed 的调用。让我想知道这些脚本中还发生了什么!
-
您的
ls是否别名为ls -C或类似名称?运行alias ls来查看。 (顺便说一句,这只是解析ls输出是一个 Bad Idea™ 的原因之一,即使在 Bash 脚本中也是如此。在 Perl 中,使用纯 Perl 命令,如glob或readdir而不是依赖于你的行为壳。)