在命令行时,我发现我必须经常输入这个命令:
查找 . -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
,验证它是否有效,并将其添加到您的路径中:
在那里编辑/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 上,创建一个别名来在所有文件中查找字符串。
- 我假设您正在使用类似 Ubuntu 12.10 的版本。
- 我假设你的用户名是“el”,你的主目录是
/home/el
- 我假设您想
find . -iname $1 -exec grep -H $2 {} \;
通过别名来运行该命令,并替换参数。 - 我假设您只想查看当前目录。
怎么做:
创建一个名为的文件,
/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
保存并打开
/home/el/.bashrc
文件。添加此命令:alias fin="/home/el/bin/findstring.sh"
保存并确保
findstring.sh
具有可执行权限:chmod +x /home/el/bin/findstring.sh
像这样获取你的源代码
/home/el/.bashrc
(或者只需重新启动终端)source /home/el/.bashrc
创建一个名为“foobar”的测试文件,其中包含文本“moobar”。
测试它。
cd /
并在终端中输入此命令:fin foobar moobar
你应该得到这个输出:
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
好的,一切正常,您已完成。但是它还告诉我们,我们没有权限搜索某些目录或文件。
如果您希望用户能够搜索系统上的任何文件,无论其所有者是谁,该怎么办?
您可能以非 root 用户身份运行了上述命令。出于安全考虑,如果您不是 root 用户,则无法搜索许多文件。如果您希望非 root 用户能够查看任何文件(无论权限如何),请使用以下步骤。(按严格标准,这是一种安全漏洞)。
在您的 sudoers 文件中创建一个条目。
su root visudo
添加此条目:
el ALL = NOPASSWD: /usr/bin/find
编辑
/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
重新启动终端并重试:
el@apollo:/$ fin foobar moobar command: find . -iname foobar -exec grep -H moobar {} \; 2>/dev/null /home/el/foobar:moobar
它有效!您无需输入密码即可查看 root 拥有的文件,并且程序搜索了名为 foobar 的文件,其中包含文本“moobar”。找到并返回了一个文件。
做一些现实世界的测试:
在文件系统的某个地方创建一个目录,将其命名为 cats.txt,并将字符串“allyourbasearebelongtousnow”放入其中。
运行命令:
el@apollo:/$ fin *.txt allyourbase command: find . -iname *.txt -exec grep -H allyourbase {} \; 2>/dev/null ./home/el/cats.txt:allyourbasearebelongtousnow
在文件系统中的每个文件中搜索包含“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
命令。原因是星号是终端上的保留符号,表示“在此处替换正确目录中的所有目录和文件”。因此,我保留了“全部”一词来代替星号。