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