遞歸腳本不起作用

遞歸腳本不起作用

我正在嘗試添加遞歸支持文件grep腳本

由於某種原因,這不能按預期工作:

RECURSIVE_MODE=off

# iterate over args
for ARG in "$@"
do
    if [ -d "$ARG" ] && [ $RECURSIVE_MODE = on ] ; then
        # recursive call
        $0 $GREP_ARGS $ARG/*
    elif [ -f "$ARG" ]; then
        filecat "$ARG" | grep $GREP_ARGS | sed "s#^#$ARG: #"
    else
        [ "$ARG" = "-r" ] && RECURSIVE_MODE=on
        # append to the current grep args
        GREP_ARGS="$GREP_ARGS $ARG"
    fi
done

我想避免在這種情況下使用函數以獲得更好的可讀性。

編輯:腳本應該像這樣工作:

對於每個傳遞的參數:

  • 如果當前arg是目錄,檢查是否啟用了遞歸模式,如果是則進行遞歸呼叫;
  • 否則如果當前 arg 是文件,則使用grep當前模式呼叫;
  • 否則假設目前 arg 是 grep 模式或 grep 開關並將其附加到目前$GREP_ARGS清單。

也許這並不完全可靠,但它對我來說很好用,可以替代zgreppdfgrep等。

答案1

嘗試使用-H以下選項grep

   -H, --with-filename
          Print the filename for each match.

因此,不必調用腳本,只需執行以下操作:

grep -H PATTERN [FILE...]

另外,在嘗試編寫包裝器腳本之前,最好先檢查您正在使用的工具的手冊頁。對於常見的 Unix 工具,您想要的簡單選項幾乎總是已經內建在工具中。

答案2

我終於發現問題出grep-r開關上忽略 stdin 並在當前工作目錄中搜索。為了強制讀取標準輸入,我剛剛添加了一個-

filecat "$ARG" | grep $GREP_ARGS - | sed "s#^#$ARG: #"

相關內容