2

type1.txt, type2.txt.私は、たとえば(file are 1type1.txt, 1type2.txt,2type2.txt,2type2.txtetc )で終わるディレクトリファイル名に約 300 万から 400 万のファイルを持っています。

ここで、type1.txt と type2.txt で終わるすべてのファイルを連結したいと考えています。

現在、私はcat *type1.txt > allTtype1.txtのために同様にやっていtype2.txtます。両方の最終出力ファイルで順序を維持したかったのですが、それは私の推測ですcat。しかし、遅すぎます。

同じことを行うためのより高速な方法を提案してください。

ありがとう、ラヴィ

4

2 に答える 2

5

これは、次のコマンドを使用して実行できます。

ls | while read file; do cat $file >> allTtype${file#*type}; done

しかし、スナップが彼の回答で上で述べたようにcat、ファイルを開く必要があるたびに、ファイルがたくさんあるディレクトリでは長い時間がかかるinodeルックアップを行う必要があります。スピードアップを試みるために、Sleuth Kitのicatを使用して inode ごとに cat できます。

ls -i | while read -a file_array; do icat /dev/sda1 ${file_array[0]} >> allTtype${file_array[1]#*type}; done

さらに良いことに、結果のファイルを別のディレクトリに置くことができます。

ls -i | while read -a file_array; do icat /dev/sda1 ${file_array[0]} >> /newdir/allTtype${file_array[1]#*type}; done
于 2011-08-04T12:55:25.550 に答える
2

catそれ自体は遅くありません。ただし、シェルのワイルドカード(?および*)を展開するたびに、シェルはそのディレクトリ内のすべてのファイル名を読み取って検索します。これは非常に低速です。

また、名前でファイルを開くと、カーネルはファイルを見つけるのに時間がかかりますが、これは避けられません。これは、使用しているファイルシステム(質問では指定されていません)によって異なります。一部のファイルシステムは、他のファイルシステムよりも巨大なディレクトリでインテリジェントです。

これを整理するには、ファイルリストを1回取得することをお勧めします。

ls > /tmp/filelist

...そして、grepそのリストからファイルを選択するために、または同様のものを使用します。

cat `grep foo /tmp/filelist` > /out/bar

この混乱を整理した後、これが二度と起こらないようにストレージ/アプリケーションを構造化するようにしてください。:)また、ファイルを取り出した後は、必ずrmdir既存のディレクトリに移動してください(ファイルが1つしかない場合でも、目的を問わず再度使用しても効果はありません)。

于 2011-08-04T10:42:55.820 に答える