shell命令查找文件的工具

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

 


 

posted @ 2021-06-06 10:13  大窟窿  阅读(285)  评论(0编辑  收藏  举报