zoukankan      html  css  js  c++  java
  • 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

    +++
  • 相关阅读:
    Two sum 两个数相加
    [ACM] hdu 1286 找新朋友(欧拉函数)
    环形队中实现队列的基本运算
    队列的顺序存储结构及其基本运算的实现
    栈的链式存储结构及其基本运算实现
    栈的顺序存储结构及其基本运算实现
    [ACM] hdu 1205 吃糖果(鸽巢原理)
    [ACM] poj 3128 Leonardo's Notebook (置换群,循环节)
    hdu acm 1051 Zipper
    [ACM] poj 2369 Permutations (置换群循环节长度)
  • 原文地址:https://www.cnblogs.com/chorm590/p/14854626.html
Copyright © 2011-2022 走看看