数え切れないファイルがあるディレクトリ内のファイルを検索するには?

数え切れないファイルがあるディレクトリ内のファイルを検索するには?

リクエストログをさまざまなファイルに保存するスクリプトを作成しました。時間が経つにつれて、フォルダに含まれるファイルの数は増えているようです。これで、特定の期間の一部のログにアクセスする必要がありますが、そうすることはできません。

ログファイル名の形式は次のとおりです。 2016-02-11_124805_4269_170784456256bc8305a7e8b1455194885_req.xml

これまで私は試しました

  • ls
  • tar -cvzf 2016-02-20.tar.gz 2016-02-20*.xml圧縮ファイル
  • cat 2016-02-20_01* | grep -nr "text_to_search"
  • ls -lah >> ../list.log
  • find ./dirname -type f >> list2.log
  • そして検索スクリプト

    for each_file in ./dirname/*
    do
    echo ls -lah $each_file >> ./dirname_file.log
    done
    

そしてtar戻ってくると、cat他のarguments list too long人はまだ私に答えていません。

助けてくれてありがとう。

答え1

find ./dirname -type f -name "2016-02-20_01*"うまくいくかもしれませんが、それでも高速ではありません。

これでこれを行うことができます。

find ./dirname -type f -name "2016-02-20_01*" -print | xargs grep -n "text_to_search"

答え2

「ls」の場合、速度の低下はほとんどアラインメントによって引き起こされるという印象を受けました。

'ls -f' はソートを無効にします。私の経験によると(数年前にext3とxfsを使用してnntpサーバーを実行していた)、はるかに高速に動作します。

答え3

この試み:

perl -le 'opendir $d,".";while($f=readdir($d)){print $f if $f =~ /^2016-02-20_01/}'

これはディレクトリエントリを直接読み込み、そのエントリに対して操作を実行しようとしません。実際にファイルの内容を表示するには、次のものを使用できます。

perl -le 'opendir $d,".";while($f=readdir($d)){if($f =~ /^2016-02-20_01/){print "=== $f ===";open(my $i,"<",$f);while(<$i>){print};close($i)}}'

編集:明確にするために、これはユーザーがすでにそのディレクトリにあると仮定します。 (ドットは現在のディレクトリを表します。)そうでない場合は、「.」をディレクトリパスに置き換えます。

関連情報