which
作用
查找命令所在的路径
[root@centos76 ~]# which ip python echo
/usr/sbin/ip
/usr/bin/python
/usr/bin/echo
whereis
作用
查找命令和命令帮助文档以及源码包所在的路径
[root@centos76 ~]# whereis ip echo
ip: /usr/sbin/ip /usr/share/man/man8/ip.8.gz
echo: /usr/bin/echo /usr/share/man/man1/echo.1.gz
# -s只显示源码包
[root@centos76 ~]# whereis -s ip echo
ip:echo:
# -b只显示二进制命令
[root@centos76 ~]# whereis -b ip echo
ip: /usr/sbin/ip
echo: /usr/bin/echo
# -m只显示帮助文档
[root@centos76 ~]# whereis -m ip echo
ip: /usr/share/man/man8/ip.8.gz
echo: /usr/share/man/man1/echo.1.gz
find
作用
在指定路径中查找符合规则的文件文件夹
格式
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
-
[-H] [-L] [-P] [-D debugopts] [-Olevel]
这些属于options(选项) -
[path...] [expression]
这些属于arguments(参数) -
[]
表示可选 -
...
表示可重复 -
debugopts level path expression
这些属于占位符 每个占位符都有自己的格式
举例
环境介绍
# centos7.6-minimal(最小化)
[root@centos76 find]# pwd
/root/find
[root@centos76 find]# tree .
.
├── dir1
│ ├── a.sh
│ ├── a.txt
│ ├── b.txt
│ └── c.sh
└── dir2
├── c.txt
└── d.txt
2 directories, 6 files
find
根据上面的格式说明可知 find命令的options(选项)和arguments(参数)都是可选的,也就是说find的最简单的用法就是find命令本身:
[root@centos76 find]# find
.
./dir1
./dir1/a.txt
./dir1/b.txt
./dir2
./dir2/c.txt
./dir2/d.txt
此时会把当前路径下的所有文件夹和文件递归的打印出来(包括隐藏文件夹和隐藏文件)
我们在使用find命令的时候,最常见的用法是find [path...] [expression]
其中path表示从哪里找 expression表示查找的条件和找到后的动作
所以接下来重点介绍下 path 和 expression
path
path表示从哪里找 而且是可重复的 也就是说可以同时从多个目标目录中查找
[root@centos76 find]# find ./dir1 ./dir2
./dir1
./dir1/a.txt
./dir1/b.txt
./dir2
./dir2/c.txt
./dir2/d.txt
expression
expression表示 查找的条件和找到后的动作
expression本身包括三个部分options tests actions
options表示选项
tests表示条件会返回true或者false
actions表示动作
常用的方式是 tests
或者 tests actions
先说tests 常用的tests有如下几种
-
-name pattern
例如-name *.txt
表示name是.txt结尾的文件 -
-type c
c是占位符表示文件类型 例如-type d
表示类型是文件夹- b block (buffered) special
- c character (unbuffered) special
- d 文件夹
- p named pipe (FIFO)
- f 普通文件
- l symbolic link
- s socket
- D door (Solaris)
再说actions 常用的actions有如下几种
-
-print
打印 如果 expression中没有action 那么默认的action就是 -print -
-delete
删除 -
-exec command
执行命令
介绍完这些格式,来个例子看一下
# -print 可以不写 expression中没有action默认的action就是 -print
# ./dir1 ./dir2 表示查找的路径
# -name *.txt -print 是expression 其中-name *.txt表示条件 -print表示动作
# 整体的意思是从./dir1和./dir2两个目录中找到名字以.txt结尾的文件并打印出来
[root@centos76 find]# find ./dir1 ./dir2 -name *.txt -print
./dir1/a.txt
./dir1/b.txt
./dir2/c.txt
./dir2/d.txt
# 从./dir1和./dir2两个目录中找到名字是a.txt的文件对其执行cat命令
# 其中 {} \;是固定写法
[root@centos76 find]# find ./dir1 ./dir2 -name a.txt -exec cat {} \;
a.txt-line1
a.txt-line2
find小结
find 从哪里找 条件是什么 找到后干什么
- 从哪里找是path
- 条件是什么是expression中的tests
- 找到后干什么是expression中的actions
- 其中test和action有很多功能具体看
man find
帮助手册 - find命令耗时耗资源,path范围一定要尽量小,服务器繁忙时段不要执行
扩展
expression 还可以有复杂的形式
-
expression1 -a expression2
-a表示并且 -
expression1 expression2
不写默认表示并且 -
expression1 -o expression2
-o表示或者
[root@centos76 find]# find . -name *.txt -o -name *.sh -print -exec cat {} \;
./dir1/c.sh
./dir1/a.sh
a.sh-line1
a.sh-line2
注意: 这个例子中 a.txt也符合条件但是没有对其做任何操作这是为什么呢?
原因是-o连接的是两个expression,也就是说-name *.txt
是一个完整表达式,
-name *.sh -print -exec cat {} \;
是一个完整表达式。
a.txt虽然符合-name *.txt
但是因为其没有action所以没有对其做任何操作。
上文说过expression中没有action 那么默认的action就是 -print,对此种情况不适用,
因为-name *.txt -o -name *.sh -print -exec cat {} \;
作为一个整体是有acton的。
修改成-name *.txt -print -o -name *.sh -exec cat {} \;
表示找到.txt打印文件名称,找到.sh打印文件内容。
[root@centos76 find]# find . -name *.txt -print -o -name *.sh -exec cat {} \;
./dir1/a.txt
./dir1/b.txt
a.sh-line1
a.sh-line2
./dir2/c.txt
./dir2/d.txt
注意: -o
是短路操作,如果前边的expression为真,后面的expression无论真假都不执行
网友评论