2021-06-06
關鍵字:Shell具體應用
需求:在指定目錄中查找文件名包含指定字符的文件
- 支持自定義關鍵字查找
- 支持自定義查找路徑及查找關鍵字
使用方式:
假設這個工具的名稱爲:fgtool.sh (取意 shell tool for find and grep)。
直接運行此工具,將會打印Usage信息:
root@ubuntu:~# ./fgtool.sh you can search file by filter-keyword in current directory or a specify directory Usage: fgtool.sh path_wanna_search filter_wanna_grep or: fgtool.sh filter_wanna_grep
在當前目錄下指定關鍵字查找:
root@ubuntu:~# ./fgtool.sh tool fgtool.sh
指定目錄以及關鍵字查找:
root@ubuntu:~# ./fgtool.sh /etc host host.conf hostname hosts hosts.allow hosts.deny
以下是此查找工具的源碼:
#!/bin/sh SEARCH_PATH=. FILTER="" CAN_RUN=1 if [ $# = 1 ]; then FILTER=$1 if [ "$FILTER" = "" ]; then FILTER="" fi elif [ $# = 2 ]; then SEARCH_PATH=$1 if [ "$SEARCH_PATH" = "" ]; then SEARCH_PATH=. fi FILTER=$2 if [ "$FILTER" = "" ]; then FILTER="" fi else echo "you can search file by filter-keyword in current directory or a specify directory" echo "Usage: fgtool.sh path_wanna_search filter_wanna_grep" echo " or:" echo " fgtool.sh filter_wanna_grep" echo "" CAN_RUN=0 fi if [ $CAN_RUN = 1 ]; then for filename in `ls -a $SEARCH_PATH` do if echo "$filename" | grep $FILTER then echo 0 > /dev/null fi done fi
源碼前面首先定義了三個變量
1、查找的路徑及默認值。默認爲在當前目錄下查找;
2、過濾的關鍵字及默認值。默認值爲不過濾;
3、是否可以執行查找功能的標誌位;
接下來是對參數的判斷。
當沒有參數時,直接打印Usage信息並清除執行查找功能的標誌位。
當有一個參數時,將它識別成是過濾關鍵字。
當有兩個參數時,將第一個參數識別爲查找路徑,第二個參數識別爲過濾關鍵字。
另外,在對關鍵字賦值時還要判空,如果參數內容爲空時則用回默認值。(事實上這裏的判空沒有意義)
再下面就是執行查找功能了。
在一個for循環中逐個匹配。使用 ls -a 命令列出指定目錄下的所有文件。隨後通過 if + grep 組合語句來判斷是否符合條件。
這個 if + grep 組合語句是核心部分。當正在匹配的文件不滿足條件時,其結果是空值,即屏幕上不會有任何輸出。而當條件滿足時,屏幕上將會輸出此語句的執行結果,而執行結果即是將當前文件名打印出來。換句話說,在匹配條件的同時就已經決定了要不要將目標文件名打印出來了。因此,當 if 語句滿足時,就不應再二次打印文件名了。不過似乎shell不允許空的 if 語句存在,因此就加了一段無意義的 echo 0 > /dev/null 語句去湊數。
至此,便實現了我們的需求。
最後,其實這個小工具完全可以只使用一行命令來代替:
ls -a PATH | grep KEYWORD