2008-09-02 7 views
30

約200万のファイルを含むディレクトリリストを取得しなければなりませんが、lsコマンドを実行すると何も戻ってこないのです。私は3時間待った。私はls | tee directory.txtを試しましたが、それは永久にハングアップするようです。クイックlsコマンド

私はサーバーがたくさんのinodeソートを行っていると仮定します。 lsコマンドをスピードアップしてファイル名のディレクトリリストを取得する方法はありますか?私はこの時点でサイズ、日付、許可などを気にしません。

答えて

1

find ./ -type f(現在のディレクトリ内のすべてのファイルが見つかります)について教えてください。すべてを見つけるには-type fを離陸してください。

+0

だった。これは、現在のディレクトリ内のファイルを見つけるだろう、ともどのサブディレクトリでも。 – mwfearnley

10

は、使用してみてください:

find . -type f -maxdepth 1 

これは、ファイルやディレクトリの一覧を表示したい場合は-type f引数を省略すると、ディレクトリ内のファイルを一覧表示されます。

1

お試しください:

チェックlsにエイリアスがありませんか?

alias ls 

代わりに代わりに検索してみてください。

find . \(-type d -name . -prune \) -o \(-type f -print \) 

これが役に立ちます。

3

出力をリダイレクトして、lsプロセスをバックグラウンドで実行できます。

ls > myls.txt & 

これは、実行中にあなたのビジネスについて継続することを可能にします。それはあなたのシェルをロックしません。

lsを実行してデータを少なくするオプションについてはわかりません。確認のためにいつでもman lsを実行することができます。

2

GNU lsを使用しているとしますか? それはいつものLS(LS --color = autoと)UNALIASます

\ls 

を試してみてください。

+0

本当に、色づけが私の普通の原因です:色付けするとき、 'ls'は各ディレクトリエントリのタイプとモードを決定しようとします。その結果、たくさんの' stat(2) '呼び出しが行われます。 – Ruslan

33
ls -U 

はソートせずにlsを行います。

+1

'ls -U | sort'が' ls'より速いかどうか知っていますか? – User1

+1

私は分かりません。私はそれが疑問です。なぜなら、 'ls'の別のプログラムで行われたかどうかにかかわらず、ソートはすべてのレコードを見るまで完了できないからです。しかし、それをテストすることが唯一の方法です。 –

+3

注:一部のシステムでは、 'ls -f'は' ls -aU'と等価です。つまり、_all_ファイル(名前が '。'で始まるファイルも含む)を含み、ソートしません。 _some_システムでは、 '-f'はソートを抑止する***オプション、' -U'は何か他のこと(何もしません)を行います。 – Scott

0

どのパーティションタイプを使用していますか?

1つのディレクトリに数百万の小さなファイルがあるため、JFSやReiserFSを使用すると良いでしょう。

0

使用しているオペレーティングシステムとファイルシステムの種類に関する情報を提供する必要があります。特定のUNIXや特定のファイルシステムでは、コマンドとしてffncheckを使用することができます。

2

プロセスが「復帰しない」場合は、プロセスがオペレーティングシステムとどのように対話しているかを分析するには、straceをお勧めします。LSの場合

$strace ls 

あなたはそれが実際には何も出力する前に、それはすべてのディレクトリエントリ(getdents(2))を読み取ることがわかるだろう。ここで他の良いソリューションの

-1

多くは(それはすでにここに述べたよう...並べ替え)が、完全性の利益のために:

echo * 
+3

2百万のファイルがあるため、「コマンドラインが長すぎます」というエラーだけが返される可能性があります。 – richq

-2

またxargsのを利用することができます。 の出力をlsからxargsにパイプするだけです。それが動作しないとは上記の作業をされていない例を見つけた場合、それはあなたの問題を引き起こしている可能性がありますメモリの使用状況を助けることができるよう

ls | xargs 

は、xargsのにそれらをパイプしてみてください。

1

いくつかのフォロー: あなたが使用しているLSのバージョンを示しているに役立つだろうこれは、あなたが実行しているものをOS言及していません。これはおそらくlsの質問のような 'bash'の質問ではないでしょう。私の推測では、GNU lsを使用しているということです。これにはいくつかのコンテキストで便利な機能がいくつかありますが、大きなディレクトリではあなたを殺してしまいます。しようと

GNU lsが列の配列きれいに持っています。 GNUはすべてのファイル名をスマートに手配しようとしています。巨大なディレクトリには、時間がかかり、メモリが必要です。 '修正' に

これ、あなたが試すことができます:

ls -1#すべて

で何の列は、BSD LSどこかを見つけていないhttp://www.freebsd.org/cgi/cvsweb.cgi/src/bin/ls/とあなたの大切なディレクトリにそれを使用します。これはおそらく、便利な答えはありませんが、あなたが持っていない場合findあなたは、私が聞いていtar

$ tar cvf /dev/null . 

で間に合わせることができるかもしれ

4

を見つけるよう

使用する他のツール、 「バック日に」、つまり私より年上の人で、シングルユーザーとリカバリ環境は、彼らが今日であるよりも多くの制限されました。それはこのトリックがどこから来るのかです。

2

これは、私の知る限り最速のオプションのようになります。ls -1 -f

  • -1(ノー列)
  • -f(NOソートなし)
0

ファイルのリストを取得するには、いくつかの方法があります。

はソートせずにリストを取得するには、このコマンドを使用します。

ls -U 

またはファイルリストをu歌う:

ls /Folder/path > ~/Desktop/List.txt 
4

ls -1 -f 

を使用すると、約10倍高速であり、

(私は100万個のファイルでテストが、私の元の問題は6つの800 000 000ファイルを持っていた)行うのは簡単です

私の場合、特定のディレクトリに10 000を超えるファイルが含まれているかどうかを確認する必要がありました。 1万以上のファイルがある場合、私はもはやそこにいくつのファイルがあるか興味がありません。私はちょうどそれが速く実行され、残りを1つずつ読むことを試みないようにプログラムを終了しました。 10000未満の場合は、正確な金額を印刷します。私のプログラムの速度は、ファイルの量よりも大きな値をパラメータに指定すると、ls -1 -fと非常に似ています。

あなたは次のように入力して、現在のディレクトリに私のプログラムのfind_if_more.plを使用することができます:あなたは、n個のファイルを超えるがある場合、スクリプトはLSよりも早く終了します-1 -fを非常にだけ興味があるなら

find_if_more.pl 999999999 

を大量のファイル。

#!/usr/bin/perl 
    use warnings; 
    my ($maxcount) = @ARGV; 
    my $dir = '.'; 
    $filecount = 0; 
    if (not defined $maxcount) { 
     die "Need maxcount\n"; 
    } 
    opendir(DIR, $dir) or die $!; 
    while (my $file = readdir(DIR)) { 
     $filecount = $filecount + 1; 
     last if $filecount> $maxcount 
    } 
    print $filecount; 
    closedir(DIR); 
    exit 0; 
3

この質問は興味深いようですが、私は複数の回答を投稿しました。投稿された回答の効率を理解するために、私は200万のファイルでそれらを実行し、結果を以下のように見つけました。

$ time tar cvf /dev/null . &> /tmp/file-count 

real 37m16.553s 
user 0m11.525s 
sys  0m41.291s 

------------------------------------------------------ 

$ time echo ./* &> /tmp/file-count 

real 0m50.808s 
user 0m49.291s 
sys  0m1.404s 

------------------------------------------------------ 

$ time ls &> /tmp/file-count 

real 0m42.167s 
user 0m40.323s 
sys  0m1.648s 

------------------------------------------------------ 

$ time find . &> /tmp/file-count 

real 0m2.738s 
user 0m1.044s 
sys  0m1.684s 

------------------------------------------------------ 

$ time ls -U &> /tmp/file-count 

real 0m2.494s 
user 0m0.848s 
sys  0m1.452s 


------------------------------------------------------ 

$ time ls -f &> /tmp/file-count 

real 0m2.313s 
user 0m0.856s 
sys  0m1.448s 

------------------------------------------------------ 

  1. ls -fコマンドが少し速くls -Uよりも走った結果を要約します。色を無効にするとこの改善が起こった可能性があります。
  2. findコマンドは平均速度2.738秒で3回実行されました。
  3. 実行中はちょうどlsで42.16秒かかりました。ここで私のシステムでlsls --color=autoの別名です
  4. echo ./*でシェル拡張機能を使用して50.80秒実行しました。
  5. そして、tarベースの溶液は約37mlを要した。

システムがアイドル状態のときは、すべてのテストが別々に実行されました。

ここで重要な点の1つは、ファイルリストが端末に印刷されず、 ファイルにリダイレクトされ、ファイル数がwcコマンドで後で計算されたことです。 出力が画面に印刷されている場合、コマンドが遅すぎました。

これはなぜ起こりますか?

3

私はそれに400万ファイルとディレクトリを持っていると私はLSは最初かき回すのがあまりなく、すぐにファイルを吐き出すようになった唯一の方法は

ls -1U 
+0

私の一日が保存されました!ありがとう! – dschu

関連する問題