約8000個のファイル処理時に「find: fts_read: Invalid引数」が発生

約8000個のファイル処理時に「find: fts_read: Invalid引数」が発生

GNU bashバージョン3.2.48にはこのバグがあります。バージョン 3.2.57 は使用できなくなりました。

8000の同じ行を含むファイルを作成します(各行が書き込まれると仮定1)。split -a3 -p "1"run on it (与えられたパターンに従って分割する-pBSD オプションです。 1 行に 1 行しかないファイルの場合は、実行して標準と同じ操作を実行できます)。split1splitsplit -a3 -b 1

find . -name xaaa -exec echo {} +

予想された出力の後にfind: fts_read: Invalid argumentは に出力されます。cerrファイルセットと他のコマンドをxaaa置き換えると同じエラーが発生します。echoファイル名の長さは重要ではありません。ファイルのディレクトリも重要ではありません。

他の場所でいくつかのファイルを生成した後、エラーは消えました。ただし、複数のファイルを含む別のワイルドカード(または少なくとも1つがディレクトリリストの先頭にあります)xaaaに置き換えると、エラーが再発生します。xaa*現時点では、エラーを引き起こす単一のファイルはありません。

+次のように置き換えると;エラーは防止されますが、私のスクリプトでは許可されていません。この問題は私のスクリプトの他の場合に断続的に発生しましたが、問題を減らすことでそれを複製する簡単な方法を見つけることができました。

エラーが発生した場合はスクリプトを停止したいが、これを行うとスクリプトが頻繁に停止します。この問題を解決する方法を知っていますか? (たとえば、エラーコードを検索してこの特定のエラーを無視します。)

Mac OSバージョン10.8.5。ダーウィンカーネルバージョン12.5.0。

ベストアンサー1

bashが関連する可能性はほとんどありません。

Bashの役割は、このコードを解析し、、、、、、、を使用してfind . -name xaaa -exec echo {} +実行に変換することです。すべてのbashバージョンは同じことを行います。/path/to/findfind.-namexaaa-exececho{}+

ここでfind:エラーメッセージの接頭辞として、エラーはによるものではなくによるfindものですbash。特に、関数から返されたエラーについてですfts_read()

macosfindは FreeBSD バージョンで、Apple で修正した可能性があります。

ありがたいことに、FreeBSD(Macosではない場合)はFLOSSで、比較的見つけるのは簡単です。エラーがコードに出力されます。

/*
 * find_execute --
 *  take a search plan and an array of search paths and executes the plan
 *  over all FTSENT's returned for the given search paths.
 */
int
find_execute(PLAN *plan, char *paths[])
[...]
    e = errno;
    finish_execplus();
    if (e && (!ignore_readdir_race || e != ENOENT))
        errc(1, e, "fts_read");
    return (exitstatus);
}

関数が終わったらfind_execute

ここで私たちは以下を得ます:

 find: fts_read: Invalid argument

Invalid argumenterrnoに対応するエラーメッセージEINVAL

ここで呼び出しが行われる前のループの条件文で as が 0errnoに設定されており、fts_readループを終了するので、this 手段だけが返されます。errnowhilefts_readfts_readNULL

見たらマニュアルページfts_read、あなたは見つけるでしょう:

関数fts_read()fts_children()は失敗する可能性があり、errno ライブラリ関数とで指定されたエラーを設定できます。chdir(2)malloc(3)opendir(3)readdir(3)stat(2)

これらのリンクに沿って別のマニュアルページに移動すると、そのいずれもEINVALを返しません。

findしたがって、Appleやftsライブラリのバグと非常によく似ています。コードにアクセスできない場合は、私たちができることはあまりありませんので、この問題をAppleサポートに提出することをお勧めします。

おすすめ記事