2017-05-25 11 views
0

特定の行のテキスト(#SomeTag)を含むすべてのファイルについて、OSXシステム上のフォルダをスキャンする方法を見つけようとしています(ファイル名ではなくファイル内のテキストを探しています特定の行にハッシュタグを含むすべてのファイルを検索して検索する方法

agfzfと試してみましたが、私が望むように動作させることはできません。

私は、特定の行でいくつかのハッシュタグを持っていることfzfでファイルを検索したい 例:

#TagOne #TagTwo searchpattern 

これは、最初の行に#TagOne #TagTwoがあるファイルでのみ、searchpatternを検索します。

更新: これまでのところ私は聖霊降臨祭に動作しますが、そのはるかに最適なのが、それは私がしたい正確にどのように動作します。このソリューションを思い付きました。スクリプトは、すべての見つかったファイルの内容で完全なテキストファジー検索を行うことができるファイルを見つけた後、1〜3引数を取ります。

#!/bin/sh 
if [ "$#" == 1 ]; then 
    ag -Ril $1 ./Evernote | xargs ag --nobreak --nonumbers --noheading . | fzf 
fi 
if [ "$#" == 2 ]; then 
    ag -Ril $1 ./Evernote | xargs ag -il $2 | xargs ag --nobreak --nonumbers --noheading . | fzf 
fi 
if [ "$#" == 3 ]; then 
    ag -Ril $1 ./Evernote | xargs ag -il $2 | xargs ag -il $3 | xargs ag --nobreak --nonumbers --noheading . | fzf 
fi 
+0

* "fzf" *のファイルとは何ですか?私たちは、正規表現に縛られないパターンにマッチするという要件を設定しました。最初の行だけを検索しているとはどうすればわかりますか?もう一度考えてみてください。もう誰もあなたを助けることができないと恐れています。 –

+0

@ MarkSetchell fzfはコマンドラインファジーファインダです。 – emKaroly

答えて

3
for file in `find [path] -type f`; do head -1 $file | grep [pattern] >> /dev/null && echo $file; done 

あなたが '#TagOne #TagTwoのsearchPattern' のような、探しているものは何でもして、[パターン]を検索したいディレクトリを[パス]を交換してください。

for file in ``; do ....; doneビットは、グレーブのコードによって返されるすべての行(バックティックのもの)を繰り返し、各行を「ファイル」と呼ばれるものに割り当てます。墓の中に、私たちは(私たちのforループによって消費されている。)あなたのパスと印刷物に(などのリンク、ディレクトリを除く)すべての「正常な」ファイルを見つけfind [path] -type fは、stdoutにそれぞれを送信してい

我々その後、それらのファイルのそれぞれにhead -1を呼び出します。これらのファイルは、それぞれの最初の行を抽出し、パターンのためにそれをgrepsします。 grepの通常の出力は気にしないので、印刷を止めるために/ dev/nullにリダイレクトします。都合の良いことに、grepの終了コードは、何かの場所に応じて、true/falseとして扱うことができます。 && echo $fileは、grepが最初の行に何か一致した場合にのみ、これを利用してファイル名を表示します。

UPDATE は、複数のパターンをサポートするには、上記の溶液をチェーンできますが、あなたが必要としているパターン毎の各ファイルを開いてしまうと思います。あなたが検索する多くのパターンを持っている場合は、これを試してみてください。

for file in `find . -type f`; do                  
    FIRSTLINE=`head -1 $file`;                  
    if [[ $FIRSTLINE == *pattern1* &&                  
     $FIRSTLINE == *pattern2* &&                  
     $FIRSTLINE == *pattern3* ]]; 
    then 
     echo $file; 
    fi; 
done 

bashがでそれほど大きくはないこと。これは、すべてのエイリアスとして使用するために1行にまで破砕することができますが、ここではラインを越えています。

#!/usr/bin/env python 
from os import walk 
from os.path import join 
import sys 

directory = sys.argv[1] # Use the first argument as the directory to search 

for root, subdirs, files in walk(directory): 
    for file in files: 
     path = join(root, file) 
     line = open(path).readline() 
     if ('TagOne' in line and  # You could also get these on 
       'TagTwo' in line and # the command-line... 
       'TagThree' in line): 
      print path 
+0

OKはほとんど動作しますが、問題は、タグ順に検索できるようにすることです。たとえば、#Tag1#Tag2と同じ検索結果を生成する必要があります#TagTho #TagThree #TagOne – emKaroly

+0

特定のハッシュタグ、または任意のハッシュタグを探していますか?探しているタグの具体的な例(必要なすべての可能性を包括的に定義するリスト)を挙げることができれば、それに一致する正規表現を定義することができます。 – Sniggerfardimungus

+0

@Sniggerfardimungus特定のタグを探しています。例えば、私はマークダウン形式でメモを持っています。すべてのファイルには1つのメモがあり、すべてのメモには "C++"、 "STL"などのような複数のタグがあります。 "タグ":検索されたタグがすべて存在するすべてのファイルを検索します。 – emKaroly

関連する問題