2017-05-25 27 views
0

我试图找到一种方法来扫描我的OSX系统上的一个文件夹,以便在特定行中包含特定字符串文本(#SomeTag“)的所有文件hashtag在第一行)只是为了澄清,我正在寻找文件内的文本,而不是在文件名如何查找和搜索特定行中的所有带有#标签的文件

我试过ag, fzf,也是组合,但不能让它工作,我想要的。

我想在文件中搜索与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'[路径]。

0123'位遍历graves中代码返回的每一行(反向事件),将每行分配到一个名为“file”的东西。坟墓里面,我们有find [path] -type f,它查找所有“正常”的文件(不包括链接,目录等)在您的路径,并打印每个发送到stdout(这是由我们for循环消耗掉。)

然后我们在这些文件的每一个上调用head -1,这些文件只提取每个文件的第一行,并通过它来模拟您的模式。由于我们不关心grep的正常输出,我将它重定向到/ dev/null以防止它被打印。方便的是,grep的退出代码可以被视为真/假,取决于它是否位于任何位置。 && 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没有那么大。设置了要求我们匹配一个不能被正则表达式限制的模式,你最好使用python:

#!/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

好吧,几乎可以工作,问题是我希望能够以任何顺序通过标签查找。例如#TagOne #TagTwo应该产生与#TagTwo #TagThree #TagOne – emKaroly

+0

相同的搜索结果您是在寻找特定的主题标签,还是仅仅是标签?如果您可以给出您要查找的标签的具体示例(一个可以全面定义您需要的所有可能性的列表),可以定义一个与其匹配的正则表达式。 – Sniggerfardimungus

+0

@Sniggerfardimungus我正在寻找特定的标签。例如,我有减价格式的笔记,所有文件都包含一个音符,每个音符都有一行“Tags:”,其中有多个标签,如“C++”,“STL”等。我想要查找所有搜索到的标签都存在的文件。 – emKaroly

相关问题