2016-06-08 58 views
0

我在查找一些文件,並且爲它編寫了一個bash腳本並以此方式使用它 - ./findme.sh "before",但它不能正常工作。有什麼問題? 我如何正確地重寫它並更美化?查找除了幾個文件夾以外包含字符串的文件

#!/bin/bash 
string=$1 
clear 
find . -name "*.*" ! -path "./node_modules" \ 
     ! -path "./bower_components" \ 
     ! -path "./public_lib/bootstrap" \ 
     ! -path "./public_lib/jquery" \ 
     ! -path "./public_lib/lib/bootstrap" \ 
     ! -path "./public_lib/lib/jquery" \ 
-print | xargs grep -o -r -n -C 3 --color=auto "$string" ./ 

echo "Search end!" 
exit 0 
+1

你到底想幹什麼?搜索目錄中的所有文件以獲取模式? – andlrc

+0

我試圖: 1.按內容遞歸搜索文件 2.排除指定的文件夾 3.以格式「path/file_name:line_number」 –

回答

1

就可以正常使用grep這個:

#!/bin/bash 
grep -rnC 3 --color=auto \ 
    --exclude-dir={node_modules,bower_components} \ 
    --exclude-dir=public_lib/{,lib/}{bootstrap,jquery} -- "$1" . 

這將搜索所有文件的遞歸和$1行號顯示和三線上面和下面的比賽。

如果你想遵循符號鏈接,你應該使用-R而不是-r

--exclude-dir={node_modules,bower_components}使用支具擴張和將擴大到:

--exclude-dir=node_modules --exclude-dir=bower_components 

而且更先進的--exclude-dir=public_lib/{,lib/}{bootstrap,jquery},將擴大到:

--exclude-dir=public_lib/bootstrap --exclude-dir=public_lib/jquery \ 
--exclude-dir=public_lib/lib/bootstrap --exclude-dir=public_lib/lib/jquery 

反斜槓和換行符增加了澄清。

+0

格式顯示找到(僅匹配)不起作用。這我已經得到了我的腳本http://imgur.com/Ga8qJuW(忽略排除的dirs)和這個 - 你的http://imgur.com/mxJangf –

+0

@ValSaven我省略了'-o',因爲它會提取比賽並沒有顯示全線。 – andlrc

0

根據查找手冊頁,您必須指定您不想匹配的完整文件名,例如, (如果它變得更深),或者使用修剪,例如, \(\(-path "./node_modules" -prune \) -o ...,在這種情況下,您必須使用-o將​​每個路徑排除,例如,

find . -name "*.*" \( -path "./node_modules" -prune \) -o \ 
     \( -path "./bower_components" -prune \) -o \ 
     \( -path "./public_lib/bootstrap" -prune \) -o \ 
     \( -path "./public_lib/jquery" -prune \) -o \ 
     \( -path "./public_lib/lib/bootstrap" -prune \) -o \ 
     \( -path "./public_lib/lib/jquery" -prune \) -o \ 
-print | xargs... 

編輯對不起,你看到的情況很容易弄亂了......

+0

可能簡化爲'\(-path ... -o -path .... -o path ... \)-prune -o -name「*。*」-print | xargs ...',因爲上面實際上是'-name「*。*」-a \(-path「./node_modules」-prune \)','-a'的優先級高於'-o'。 – BroSlow

相關問題