如何设置别名或快捷方式来执行 *nix find 命令?

如何设置别名或快捷方式来执行 *nix find 命令?

在命令行时,我发现我必须经常输入这个命令:

查找 . -iname "*php" -exec grep -H 查询 {} \;

我想设置一个别名、脚本或快捷方式以使其工作更轻松。我想做类似的事情:

mysearch 查询 ("*php") (.)

如果该命令可以以相反的顺序接受三个参数,那就太好了:

查询字符串、文件名表达式、目录

如果省略后两个参数,则默认不包含它们,并且包含当前目录。

最后,锦上添花的是,如果包含了额外的变量(第 4、第 5、第 6……),它们将在最后作为 find 命令的附加参数注入(比如我可以说 -type d)。

尝试代码

我尝试了下面的示例,但仍然无法设置默认值。我做错了什么?

/bin/bash #!/bin/bash
c=${参数1+\.}
b=${param2+\*}
a=${参数3+测试}
查找 $c -iname $b -exec grep -H $a {} \;

答案1

创建一个 shell 脚本并将其添加到您的 PATH 中:

#!/bin/bash
find $3 -iname $2 -exec grep -H $1 {} \;

命名它mysearch,使其可执行chmod +x mysearch,验证它是否有效,并将其添加到您的路径中:

来源

有关 bash 中参数的更多信息

在那里编辑/home/you/.bash_profile并添加脚本。输入 时它应该可以工作mysearch x x x。您可能希望为每个参数设置默认值。这很简单,以下是操作方法基本的先进的用途。

编辑:Bash 参数基础知识:

bash 中的参数形式为$1 $2 $3,其中$1是您关心的第一个参数。实际上有一个$0,但这是脚本的名称,当您调用它时它会出现在命令行上,因此它并不那么重要。

参数1=$1 参数2=$2

您已经非常接近了。而应该c=${param1+\.}改为:(c=${1:-"."}我认为您可以省略引号,但如果有引号,则更容易分辨出字符串是什么)。

我也会这样做${c}$c因为有时你需要括号,但把它们放在任何地方都不会错。

答案2

在 Linux 上,创建一个别名来在所有文件中查找字符串。

  1. 我假设您正在使用类似 Ubuntu 12.10 的版本。
  2. 我假设你的用户名是“el”,你的主目录是/home/el
  3. 我假设您想find . -iname $1 -exec grep -H $2 {} \;通过别名来运行该命令,并替换参数。
  4. 我假设您只想查看当前目录。

怎么做:

  1. 创建一个名为的文件,/home/el/findstring.sh 将以下命令放入其中:

    #!/bin/bash
    if [ "$1" == "all" ]
    then
      echo "command:  find / -exec grep -H $2 {} \; 2>/dev/null"
      find . -exec grep -H "$2" {} \; 2>/dev/null;
    else
      echo "command:  find . -iname $1 -exec grep -H "$2" {} \; 2>/dev/null"
      find . -iname $1 -exec grep -H $2 {} \; 2>/dev/null;
    fi
    
  2. 保存并打开/home/el/.bashrc文件。添加此命令:

    alias fin="/home/el/bin/findstring.sh"
    
  3. 保存并确保findstring.sh具有可执行权限:

    chmod +x /home/el/bin/findstring.sh
    
  4. 像这样获取你的源代码/home/el/.bashrc(或者只需重新启动终端)

    source /home/el/.bashrc
    
  5. 创建一个名为“foobar”的测试文件,其中包含文本“moobar”。

  6. 测试它。 cd /并在终端中输入此命令:

    fin foobar moobar
    
  7. 你应该得到这个输出:

    el@apollo:/$ fin foobar moobar
    command:  find . -iname foobar -exec grep -H moobar {} \; 2>/dev/null
    /home/el/foobar:moobar
    find: `/run/wpa_supplicant': Permission denied
    find: `/run/cups/certs': Permission denied
    
  8. 好的,一切正常,您已完成。但是它还告诉我们,我们没有权限搜索某些目录或文件。

如果您希望用户能够搜索系统上的任何文件,无论其所有者是谁,该怎么办?

您可能以非 root 用户身份运行了上述命令。出于安全考虑,如果您不是 root 用户,则无法搜索许多文件。如果您希望非 root 用户能够查看任何文件(无论权限如何),请使用以下步骤。(按严格标准,这是一种安全漏洞)。

  1. 在您的 sudoers 文件中创建一个条目。

    su root
    visudo
    
  2. 添加此条目:

    el ALL = NOPASSWD: /usr/bin/find
    
  3. 编辑/home/el/bin/findstring.sh并在 find 命令前添加单词“sudo”,如下所示:

    #!/bin/bash
    if [ "$1" == "all" ]
    then
      echo "command:  find / -exec grep -H $2 {} \; 2>/dev/null"
      sudo find . -exec grep -H "$2" {} \; 2>/dev/null;
    else
      echo "command:  find . -iname $1 -exec grep -H "$2" {} \; 2>/dev/null"
      sudo find . -iname $1 -exec grep -H $2 {} \; 2>/dev/null;
    fi
    
  4. 重新启动终端并重试:

    el@apollo:/$ fin foobar moobar
    command:  find . -iname foobar -exec grep -H moobar {} \; 2>/dev/null
    /home/el/foobar:moobar
    
  5. 它有效!您无需输入密码即可查看 root 拥有的文件,并且程序搜索了名为 foobar 的文件,其中包含文本“moobar”。找到并返回了一个文件。

做一些现实世界的测试:

  1. 在文件系统的某个地方创建一个目录,将其命名为 cats.txt,并将字符串“allyourbasearebelongtousnow”放入其中。

  2. 运行命令:

    el@apollo:/$ fin *.txt allyourbase
    command:  find . -iname *.txt -exec grep -H allyourbase {} \; 2>/dev/null
    ./home/el/cats.txt:allyourbasearebelongtousnow
    
  3. 在文件系统中的每个文件中搜索包含“allyourbase”的内容。

    el@apollo:/home/el$ cd /
    el@apollo:/$ fin all allyourbase
    command:  find . -iname cats -exec grep -H allyourbase {} \;
    /home/el/cats.txt:allyourbasearebelongtousnow
    

    因此您不能将星号传入我的fin命令。原因是星号是终端上的保留符号,表示“在此处替换正确目录中的所有目录和文件”。因此,我保留了“全部”一词来代替星号。

相关内容