2014-05-09 32 views
0

下面的代碼不在中工作在bashrc中,但是在其他參數爲null的終端中工作。bashrc中的代碼不起作用

search() { 
     find $1 -type f | egrep '(.$2|.$3|.$4|.$5|.$6|.$7|.$8|.$9|.$10)' 
} 
+2

代碼_by本身_將不會執行任何操作。這是一個函數聲明。除非被調用,否則它不應該做任何事情。 – devnull

+0

您是否在提示符處使用單引號?他們正在阻止參數擴大; 'egrep'正在獲取文字「$ 2」等字樣。 – chepner

+0

是的是一個功能。但是找到的行,用參數在終端中用引號替換。 – trad

回答

1

這樣寫:

search() { 
    find "$1" -type f \(-true \ 
    -o -name "*$2*" \ 
    -o -name "*$3*" \ 
    -o -name "*$4*" \ 
    -o -name "*$5*" \ 
    -o -name "*$6*" \ 
    -o -name "*$7*" \ 
    -o -name "*$8*" \ 
    -o -name "*$9*" \ 
    -o -name "*$10*" \ 
    \) 
} 
  1. 作爲@chepner指出,單引號防止擴大參數。使用雙引號。
  2. egrep將創建一個基於行的匹配結果,該結果不如上述那樣精確。它也比較慢。

如果上述語句不完全符合您的需要,請記住除了-name的模式匹配之外,GNU find還有正則表達式謂詞。沒有必要管道到grep。您可以通過構建參數find來擴展上述函數以獲取無限數量的參數,如this answer

+0

您的代碼不起作用。我需要一個搜索文件類型的函數(.mp3 | .flac | .jpeg)。但我解決了。很遺憾,我現在無法發佈,因爲我是新用戶。 – trad

+0

如果用戶提供的參數少於10個(因爲$ n將是空的,因此在這些空參數中尋找'**'......匹配任何東西),此代碼將失敗。做一個while循環來構造find語句,然後*然後*運行它。 –

+0

@OlivierDulac就像OP的代碼一樣。我描述瞭如何在上面鏈接的[其他答案](http://unix.stackexchange.com/a/127303/5377)中構建參數。 – kojiro

0

我不知道egrep獲取文字$2而不是參數。我解決了這個代碼:

search-type() { 
    case "$#" in 
     1) echo "Missing arguments";; 
     2) find $1 -type f | egrep '(.'$2')';; 
     3) find $1 -type f | egrep '(.'$2'|.'$3')';; 
     4) find $1 -type f | egrep '(.'$2'|.'$3'|.'$4')';; 
     5) find $1 -type f | egrep '(.'$2'|.'$3'|.'$4'|.'$5')';; 
     6) find $1 -type f | egrep '(.'$2'|.'$3'|.'$4'|.'$5'|.'$6')';; 
     7) find $1 -type f | egrep '(.'$2'|.'$3'|.'$4'|.'$5'|.'$6'|.'$7')';; 
     8) find $1 -type f | egrep '(.'$2'|.'$3'|.'$4'|.'$5'|.'$6'|.'$7'|.'$8')';; 
     9) find $1 -type f | egrep '(.'$2'|.'$3'|.'$4'|.'$5'|.'$6'|.'$7'|.'$8'|.'$9')';; 
     10) find $1 -type f | egrep '(.'$2'|.'$3'|.'$4'|.'$5'|.'$6'|.'$7'|.'$8'|.'$9'|.'$10')';; 
     11) echo "Many arguments";; 
    esac; 
} 

@kojiro代碼不起作用。

是否可以用正則表達式簡化這段代碼?

謝謝你們!

0

我更改了更多東西的代碼簡單清除;並與任何數量的參數一起工作。

search-type() { 
    # Flags 
    flag=0 
    fld=1 
    for x in "[email protected]" 
    do 
     # The first parameter is the directory; ignored! 
     if [ $fld = 1 ]; then 
      fld=0 
     else 
      # Verify if have more than one file 
      if [ $flag = 0 ]; then 
       cmd='-name '$x 
       flag=1 
      else 
       cmd+=' -o -name '$x 
      fi 
     fi 
    done 
    find $1 -type f $cmd; 
}