リクエストログをさまざまなファイルに保存するスクリプトを作成しました。時間が経つにつれて、フォルダに含まれるファイルの数は増えているようです。これで、特定の期間の一部のログにアクセスする必要がありますが、そうすることはできません。
ログファイル名の形式は次のとおりです。 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)}}'
編集:明確にするために、これはユーザーがすでにそのディレクトリにあると仮定します。 (ドットは現在のディレクトリを表します。)そうでない場合は、「.」をディレクトリパスに置き換えます。