1

my の下にはサブフォルダーはありません。テキストを含まない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 long0ファイルを返します。

私も試しました:

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

まったく止まらない……。

誰にもアイデアはありますか?

4

3 に答える 3

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 に答える
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.evgrades-000.evgrades-999.evfetch/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 に答える
1

xargs: argument line too longを使用する場合、問題に遭遇することはありません-exec

言う:

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

Usingは、パターンsh内の一重引用符を処理します。grep

編集:なしsh:

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