1

在我的下fetch/evs/,没有子文件夹,我有一个命令应该列出所有fetch/evs/*.ev不包含文本的文件' Error

find . -ipath '*/fetch/evs/*.ev' | xargs grep -L -e "' Error" > try0.txt

此命令返回 692 个文件。奇怪的是它忽略了满足条件的文件的一部分,例如,如果我这样做:

find . -ipath '*/fetch/evs/grades*.ev' | xargs grep -L -e "' Error" > try1.txt

此命令返回 72 个根本不存在的文件try0.txt

我真的无法理解这个......有人可以帮忙吗?

Edit1:我刚刚意识到我遗漏了一个非常重要的信息,实际上在命令之后引发了一条消息:xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option。并且该命令确实会在名称包含'. 为了纠正这个问题,我尝试了:

find . -ipath '*/fetch/evs/*.ev' | xargs -0 grep -L -e "' Error" > try3.txt

它返回xargs: argument line too long和 0 文件。

我也试过:

find . -ipath '*/fetch/evs/*.ev' -print0 | xargs -0 grep -L -e "' Error" > try4.txt

这根本不会停止....

有人有什么主意吗?

4

3 回答 3

2

这并不完全是一个答案,但也太长了,无法发表评论。

这是一个 Perl 脚本,它可以模拟您的情况:

#!/usr/bin/env perl
use strict;
use warnings;
use File::Path qw(make_path);

my $subdir = "./fetch/evs";

make_path($subdir);

for my $i (0..999)
{
    {
    my $file1 = sprintf("%s/spare-%.3d.ev", $subdir, $i);
    open my $fh, '>', $file1 or die;
    printf $fh "Nothing to look at here\n" if ($i % 2 == 0);
    printf $fh "There is an ' Error ' here\n" if ($i % 2 == 1);
    close $fh;
    }
    {
    my $file2 = sprintf("%s/grades-%.3d.ev", $subdir, $i);
    open my $fh, '>', $file2 or die;
    printf $fh "Nothing to look at here\n" if ($i % 2 == 0);
    printf $fh "There is an ' Error ' here\n" if ($i % 2 == 1);
    close $fh;
    }
}

它创建了 1,000 个名称spare-000.ev为 的文件spare-999.ev,并且还在子目录grades-000.ev中创建grades-999.ev了一个子目录fetch/evs(如果需要,它会创建该子目录)。奇数文件包含字符串' Error; 偶数文件没有。

在 Mac OS X 10.8.5 上运行:

find . -ipath '*/fetch/evs/grades*.ev' | xargs grep -L -e "' Error"

列出所有偶数文件(不包含标签字符串)和

find . -ipath '*/fetch/evs/grades*.ev' | xargs grep -l -e "' Error"

列出所有奇数文件(确实包含标签字符串)。因此,在 Mac OS X 上,您的问题不会重现。脚本在您的机器上运行正常吗?(创建一个新的子目录或至少将现有的子目录移出视线。)

如果这些命令在您的机器上运行,那么您列出的这些文件还有其他内容。如果这些命令在您的机器上不起作用,则说明您的机器存在根本问题(您上次重新启动是什么时候?)。

那么当

于 2013-09-22T21:00:55.407 回答
2

这部分问题;

which returns xargs: argument line too long and 0 file.

是 find 返回太多文件以适应最大命令行长度。可以使用 xargs 的 -n 选项来解决;

find . [snip] | xargs -n 5 ...

将导致 xargs 重复执行 ... 只有 5 个文件名而不是所有文件名。

于 2013-09-22T22:48:12.170 回答
1

如果您xargs: argument line too long使用-exec.

说:

find . -ipath '*/fetch/evs/*.ev' -exec sh -c "grep -L -e \"' Error\" {}" \;

使用处理模式sh中的单引号grep

编辑:没有sh

find . -ipath '*/fetch/evs/*.ev' -exec grep -L -e "' Error" {} \;
于 2013-09-23T05:33:43.060 回答