2017-05-25 74 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

相關問題