1. locate
locate命令是查找数据库,输出和给定字符串匹配的各个路径名
locate bin/zip
locate zip | grep bin
slocate 和 mlocate是locate常见的两种变体,不过两者往往都是locate命令的软链接
ps:locate查找是根据数据库工作的,所以如果数据库没有及时更新,那么较新的文件是查找不到的,可以使用sudo updatedb 更新数据库,通常守护进程cron也会定期执行这个命令(周期往往是一天执行一次)
2. find
locate是根据文件名来查找文件的,find可以根据 选项|测试条件|操作 来找出符合条件的文件
2.1 测试条件
-type c:查找指定类型c的文件
b | 块设备文件 |
---|
c | 字符设备文件 | d | 目录 | f | 普通文件 | l | 链接文件 |
-name pattern:根据文件名查找,往往和通配符一起使用,查找符合模式的文件
-size n:匹配大小为n的文件
ps:如果指定的是数值类型的参数,+和-表示法适用
+n,代表比指定数值大的文件;-n,代表比指定数值小的文件
另外:常用的计量单位字符如下
b | 512B块,默认单位 |
---|
c | B字节 | w | 字(2B) | k | KB(1024B) | M | MB(1024KB) | G | GB |
find ~ -type f -name "*.jpg" -size +1M
ps:-name后面的模式字符串往往和通配符搭配适用,但是shell有展开的规则,为了避免被展开,往往用单引号或者双引号标记,即用单引号或者双引号括起来
-iname patterm:和-name差不多,忽略大小写
-user name:匹配用户name的文件或目录
2.2 操作符
-and(缩写-a) | 操作符两侧的测试结果都为真,则匹配 |
---|
-or(缩写-o) | 操作符两侧任意一侧为真,则匹配 | -not(缩写!) | 操作符后的测试结果为假,则匹配 | () | 控制逻辑求值的优先级以及组成更长的表达式,和平常运算里使用的括号意义一样 |
find ~ \(-type f -not -perm 0600\) -or \(-type d -perm 0700\)
为什么这里有转义字符?
对于shell来说括号具有特殊的意义,为了避免shell解释括号,所以在命令行中需要加入转义字符
2.3 预定义操作
-delete | 删除当前匹配的文件 |
---|
-ls | 对匹配的文件执行ls -dils命令,结果输出至标准输出 | -print | 默认操作,将查找结果的完整路径名输出到标准输出 | -quit | 一旦匹配就退出 |
find ~ -type f -name "*.bak" -delete
注意:操作放到最后,因为find是从左到右执行的,如果我们把-delete放到命令的较左边,结果和我们本意可能会有差别
2.3.1 用户自定义操作
-exec commandname {} ;
-ok commandname {} ;
其中{} 所代表的是路径名,分号代表分隔符
find ~ -type f -name "foo*" -ok rm "{} ";"
rm foo1;rm foo2;rm foo3;
如上,为了提高效率,我们不想找到一个就执行一次操作,而是希望等所有符合的文件都找到了,然后执行一次命令,全部搞定,两种实现方式:
find ~ -type f -name "foo*" -ok rm "{}" "+"
find ~ -type f -name "foo*" -print | xargs rm
find命令的输出结果通过管道传递给xargs,后者构造出rm所需的参数列表
ps:处理特殊的文件名(包含空格的文件名)
类UNIX系统在命名文件名的时候允许空格,但是这给xargs这类程序识别文件名带来麻烦,因为xargs默认以空格作为分隔符,想要避免这类麻烦,就是让xargs以空字符作为分隔符(代替空格),可以通过 --null 选项 设置xargs通过空字符作为分隔符
同样,find命令也需要更改默认的分隔符(空格),指定空字符代替空格作为分隔符,可以使用-print0
find ~ -type f -name "foo*" -pirnt0 | xargs --null rm
3. touch
touch 通常用于设置或更新文件的访问(access)、变更(change)、修改(modify)时间,如果文件名参数指定的文件不存在,则创建同名的文件
|