2016-10-20 11 views
0

シェルスクリプトの新機能です。以下の質問を参考にすれば嬉しいです。Linux:入力ファイルにファイルパス名が既に存在する場合は、グロッピングファイルをスキップしてください

私は何千ものフォルダ/サブフォルダとファイルをディレクトリ~/home/dirの下に置いており、常に新しいファイルが追加されています。 (残念ながら、追加される新しいファイルのタイミングはランダムです)。

このフォルダでは、追加された新しいファイルのみをgrepします。どのファイルが新しく、どのファイルが古いかを知るために、前のgrepアクションから、すでにpath.txtという名前のtxtファイルにグレープされたファイルのパス名をディレクトリ~/homeに保存します。 path.txtファイルで例えば

、私はこの

/home/dir/b1/file50.txt 
/home/dir/abc/file52.txt 
/home/dir/det/file539.txt 
/home/dir/br/com_file6551.txt 
/home/dir/n12/d2/c_file251.txt 
/home/dir/fg/file51.txt 
etc etc.. 

のようなものを持っている場合は、ファイルように私は、grepのへの入力としてpath.txtファイルからのパス名を渡すことができる方法はありますpathnameはすでに存在していて、そのファイルをグリップしません。

これらの古いファイルをグロッピングするのをスキップする他の簡単な方法はありますか?

+0

いいえ、「grep」は除外リストを使用しません。 'find'のようなものを使ってファイルリストを生成し、 'fgrep -v -x -f path.txt'にパイプし、' xargs grep pattern'にパイプする必要があります。 – Barmar

+1

'find'を使っているならば、' -newer'オプションを使って、除外リストを使うのではなく、タイムスタンプファイルより新しいファイルを選ぶことができます。 – Barmar

+0

@ Barmar、fgrepなどの検索と配管の使用をお勧めします。 現在、スクリプトを使用して毎回すべてのファイルにgrepパターンがありますが、それは効率的ではないと思います。 "find"を使用して私はまだすべてのファイルを探していますが、fgrep -vはパス名の逆マッチングを試みていて、新しいものに基づいて、それらの新しいファイルでのみパターンの別のxargs grepを見つけます。 重要な質問:これは、すべてのファイルを単純にグロッピングする現在の方法よりも本当に効率的ですか? –

答えて

0

Barmarの提案は、すべてのファイルをgrepより速くすることがよくあります。 path.txtにあるパスが多くなればなるほど、スピードアップは大きくなります。

ここに少し追加します:find -print0 | fgrep -v -x -fのフィルタリングは機能しません。フィルタリング後にパス内のスペースをどのように処理できますか? (xargs -I{} grep <pattern> "{}"は動作しますが、二桁遅い。)

find /home/dir -type f | 
    fgrep -v -x -f path.txt | 
    tr '\n' '\0' | 
    xargs -0 grep '<pattern>' 

テストのセットアップ:21997個のファイル、〜20Kそれぞれ、いくつかのパスにスペースを持っています。私は各コマンドを数回実行し、ディスクキャッシュを制御するのに最も速い時間を使いました。

grep -R asd *          0.302s 
find * -type f -print0 | xargs -0 grep asd   0.325s 

find * -type f | 
    fgrep -v -x -f ../5000paths.lst |    0.228s 
    tr '\n' '\0' | 
    xargs -0 grep asd 

find * -type f | 
    fgrep -v -x -f ../10000paths.lst |    0.269s 
    ... 

find * -type f | 
    fgrep -v -x -f ../15000paths.lst |    0.189s 
    ... 

find * -type f | 
    fgrep -v -x -f ../20000paths.lst |    0.094s 
    ... 

find * -type f | 
    fgrep -v -x -f ../all21997paths.lst |   0.059s 
    ... 
+1

ありがとうwebb、素晴らしいテスト! –

+0

あなたは大歓迎です:) – webb

関連する問題