22

コマンド ライン プロンプトでサーバー上で 2 日間ジョブを実行しています。

find data/ -name filepattern-*2009* -exec tar uf 2009.tar {} ;

それは永遠にかかり、それからいくらかかかります。はい、ターゲット ディレクトリには何百万ものファイルがあります。(各ファイルは、十分にハッシュ化されたディレクトリ構造のわずか 8 バイトです。) しかし、実行しているだけです...

find data/ -name filepattern-*2009* -print > filesOfInterest.txt

...所要時間はわずか 2 時間ほどです。私の仕事の進行速度では、数週間は終わらないでしょう.. それは不合理に思えます。これを行うためのより効率的な方法はありますか? たぶん、より複雑なbashスクリプトを使用していますか?

二次的な質問は、「なぜ私の現在のアプローチはとても遅いのですか?」です。

4

9 に答える 9

25

1つのオプションは、cpioを使用してtar形式のアーカイブを生成することです。

$ find data/ -name "filepattern-*2009*" | cpio -ov --format=ustar > 2009.tar

cpioは、トップレベルのディレクトリではなく、stdinからのファイル名のリストをネイティブに処理するため、この状況に理想的なツールになります。

于 2010-04-23T08:56:48.830 に答える
21

ファイルリストを作成した2番目のコマンドをすでに実行している場合は、-Tオプションを使用して、保存されているファイルリストからファイル名を読み取るようにtarに指示します。1つのtarコマンドとNつのtarコマンドを実行する方がはるかに優れています。

于 2010-04-23T14:34:36.210 に答える
8

以下は、xargs や exec を使用せずに必要なことを実行できる find-tar の組み合わせです (これにより、顕著なスピードアップが得られるはずです)。

tar --version    # tar (GNU tar) 1.14 

# FreeBSD find (on Mac OS X)
find -x data -name "filepattern-*2009*" -print0 | tar --null --no-recursion -uf 2009.tar --files-from -

# for GNU find use -xdev instead of -x
gfind data -xdev -name "filepattern-*2009*" -print0 | tar --null --no-recursion -uf 2009.tar --files-from -

# added: set permissions via tar
find -x data -name "filepattern-*2009*" -print0 | \
    tar --null --no-recursion --owner=... --group=... --mode=... -uf 2009.tar --files-from -
于 2010-04-23T10:05:33.157 に答える
7

これにはxargsがあります:

find data/ -name filepattern-*2009* -print0 | xargs -0 tar uf 2009.tar

情報が少ないのでなぜ遅いのか推測するのは難しいです。ディレクトリの構造、使用するファイルシステム、作成時にどのように構成されたか。単一のディレクトリに何百万ものファイルがあることは、ほとんどのファイルシステムにとって非常に難しい状況です。

于 2010-04-23T08:46:16.583 に答える
3

奇妙な (しかし正当な) 文字 (改行など) を含むファイル名を正しく処理するには、find の -print0 を使用してファイル リストを filesOfInterest.txt に書き込む必要があります。

find -x data -name "filepattern-*2009*" -print0 > filesOfInterest.txt
tar --null --no-recursion -uf 2009.tar --files-from filesOfInterest.txt 
于 2010-05-01T14:18:02.763 に答える
2

現在のやり方では、ファイルが見つかるたびにtarコマンドを呼び出していますが、これは驚くほど遅くはありません。印刷に2時間とtarアーカイブを開くのにかかる時間を費やす代わりに、ファイルが古くなっているかどうかを確認し、それらをアーカイブに追加するのではなく、実際にはそれらの時間を掛け合わせています。すべての名前をバッチ処理した後、おそらくxargsを使用して呼び出しを実行した後、tarコマンドを1回呼び出す方がうまくいく可能性があります。ちなみに、星は引用符なしでシェルによって展開されるため、filepattern- *2009*ではなく'filepattern-*2009*'を使用していることを願っています。

于 2010-04-23T08:47:04.757 に答える