find -exec パフォーマンスの向上

find -exec パフォーマンスの向上

Javaプログラムに渡すには、ディレクトリ内のサブディレクトリ(ファイルではない)のリストが必要です。だから私はこのコマンドを使ってLinuxボックスのリストを取得します。

find /some_directory -depth -maxdepth 1 -mindepth 1 -exec basename {} \; > listfile.txt

その後、listfile.txtそれをJavaプログラムにパラメータとして渡します。 Javaプログラム自体からリストディレクトリを取得する際にいくつかの問題があるので、そうします。ただし、ファイル数が200,000を超えるため、上記のコマンドfindには多くの時間(約35分)かかります。

最適化できますか?それとも、より良いオプションがありますか?

答え1

GNU1を使用してパスではなくファイル名のみを印刷するには、次のように.explainedにfind置き換えることができます。-exec basename-printf '%f\n'牛に似た一種の栄養findマニュアルページ:

%F

すべての先行ディレクトリファイル名を削除します(最後の要素のみ)。

また、内部ディレクトリのみを出力するには、次の-type dオプションを使用する必要があります。

find /some_directory -maxdepth 1 -mindepth 1 -type d -printf '%f\n' > listfile.txt

-depth深さ(1)のファイルだけを探しているので重複します。

-maxdepthGNU 拡張でもありますが、-mindepth逆に-printf他のいくつかのfind実装にも表示されます。

答え2

sum 以外のディレクトリに項目のリストを 1.行に 1 つずつ保存する場合、このコマンドとそのオプションの目的は次のとおりです。../some_directoryls-A

ls -A /some_directory > listfile.txt

これはリストをソートする利点もあります(GNUを使用するとlsソートを無効にするために使用できます-U)。

basenameあなたの場合、ファイルごとに1つのコマンドを実行するので、これは非常に非効率的です。

関連情報