linux系统文件的查找
linux系统文件的查找
find命令
基本格式
1 | find < path > < expression > < cmd > |
find命令常用选项及实例
- -name 按照文件名查找文件。
1 | 在/dir目录及其子目录下面查找名字为filename的文件 |
- -perm 按照文件权限来查找文件。
1 | find . -perm 755 –print # 在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件 |
- -prune 使用这一选项可以使 find 命令不在当前指定的目录中查找,如果同时使用 -depth 选项,那么 -prune 将被 find 命令忽略。
1 | find /apps -path "/apps/bin" -prune -o –print # 在/apps目录下查找文件,但不希望在/apps/bin目录下查找 |
- -depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
1 | find / -name "CON.FILE" -depth –print # 它将首先匹配所有的文件然后再进入子目录中查找 |
- -user 按照文件属主来查找文件。
1 | find ~ -user sam –print # 在$HOME目录中查找文件属主为sam的文件 |
- -group 按照文件所属的组来查找文件。
1 | find /apps -group gem –print # 在/apps目录下查找属于gem用户组的文件 |
- -mtime -n +n 按照文件的更改时间来查找文件, -n 表示文件更改时间距现在n天以内,+n 表示文件更改时间距现在 n 天以前。
1 | find / -mtime -5 –print # 在系统根目录下查找更改时间在5日以内的文件 |
- -nogroup 查找无有效所属组的文件,即该文件所属的组在 /etc/groups 中不存在。
1 | find / –nogroup -print |
- -nouser 查找无有效属主的文件,即该文件的属主在 /etc/passwd 中不存在。
1 | find /home -nouser –print |
-newer file1 ! file2 查找更改时间比文件 file1 新但比文件 file2 旧的文件。
-type 查找某一类型的文件,
诸如:
b - 块设备文件,比如磁盘。
d - 目录。
c - 字符设备文件,比如鼠标键盘网卡。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
1
2
3
find /etc -type d –print # 在/etc目录下查找所有的目录
find . ! -type d –print # 在当前目录下查找除目录以外的所有类型的文件
find /etc -type l –print # 在/etc目录下查找所有的符号链接文件
- -size 查看指定大小的文件
1 | find . -size +1m –print # 在当前目录下查找文件长度大于1 M字节的文件 |
-mount:在查找文件时不跨越文件系统 mount 点。
1
find . -name “*.XC” -mount –print # 从当前目录开始查找位于本文件系统中文件名以XC结尾的文件(不进入其他文件系统)
-follow:如果 find 命令遇到符号链接文件,就跟踪至链接所指向的文件
-exec,find 命令对匹配的文件执行该参数所给出的 shell 命令。相应命令的形式为 ’command’ {} \;,注意 {} 和 \; 之间的空格
1
2
3
4
5
6
7find ./ -size 0 -exec rm {} \; # 删除文件大小为零的文件
rm -i `find ./ -size 0`
find ./ -size 0 | xargs rm -f &
为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中:
find . -type f -exec ls -l {} \;
在/logs目录中查找更改时间在5日以前的文件并删除它们:
find /logs -type f -mtime +5 -exec rm {} \;-ok,和 -exec 的作用相同,只不过以一种更为安全的模式来执行该参数所给出的 shell 命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
1 | find . -name "*.conf" -mtime +5 -ok rm { } \; # 在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示 |
1 | 查找当前路径下的所有普通文件,并把它们列出来。 |
命令中的选项为:
1 | ''' |
1 | ls -l | grep '^a' 通过管道过滤ls -l输出的内容,只显示以a开头的行。 |
pattern为所要匹配的字符串,可使用下列模式
- . 匹配任意一个字符
- * 匹配 0 个或多个 * 前的字符
- ^ 匹配行开头
- $ 匹配行结尾
- [] 匹配 [ ] 中的任意一个字符,[] 中可用 - 表示范围,
- 例如 [a-z] 表示字母 a 至z 中的任意一个
- \ 转意字符
xargs命令
基本格式
1 | xargs定位参数位置 | xargs控制参数位置 | 如何定位控制xargs参数位置 |
背景:
管道 + xargs 用于把上游输出转换为下游参数输入。
例如 ls *.bak | xargs rm -f
问题:
xargs默认把输入作为参数放到命令的最后,但是很多命令需要自己定位参数的位置,比如拷贝命令 cp {上游结果} destFolder
解决方法:
xargs 使用大写字母i 定义参数指示符 -I <指示符>,然后用这个参数指示符定位参数插入的位置, 例如:
1 | ls *.bak | xargs -I % cp % /tmp/test |
之所以能用到 xargs 这个命令,关键是由于很多命令不支持 | 管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令,例如:
1 | find /sbin -perm +700 | ls -l # 这个命令是错误的 |
xargs 可以读入 stdin 的资料,并且以空白字元或断行字元作为分辨,将 stdin 的资料分隔成为 arguments 。 因为是以空白字元作为分隔,所以,如果有一些档名或者是其他意义的名词内含有空白字元的时候, xargs 可能就会误判了~
选项解释
- -0 当sdtin含有特殊字元时候,将其当成一般字符,像/ ‘ 空格等
1 | echo "//"|xargs echo |
- -a file 从文件中读入作为 sdtin
1 | cat test#!/bin/shecho "hello world/n" |
- -e flag ,注意有的时候可能会是 -E,flag 必须是一个以空格分隔的标志,当 xargs 分析到含有 flag 这个标志的时候就停止。
1 | cat txt # /bin tao shou kun |
- -p 当每次执行一个 argument 的时候询问一次用户。
1 | cat txt|xargs -p echoecho /bin tao shou kun ff ?...y # /bin tao shou kun ff |
- -n num 后面加次数,表示命令在执行的时候一次用的 argument 的个数,默认是用所有的
1 | cat txt|xargs -n1 echo |
- -t 表示先打印命令,然后再执行。
1 | cat txt|xargs -t echoecho /bin tao shou kun #/bin tao shou kun |
- -i 或者是 -I,这得看 linux 支持了,将 xargs 的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
1 | ls | xargs -t -i mv {} {}.bak |
- -r no-run-if-empty 当 xargs 的输入为空的时候则停止 xargs,不用再去执行了。
1 | echo ""|xargs -t -r mv |
- -s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数
1 | cat test |xargs -i -x -s 14 echo "{}" |
-L num Use at most max-lines nonblank input lines per command line.-s是含有空格的。
-l 同-L
-d delim 分隔符,默认的 xargs 分隔符是回车,argument 的分隔符是空格,这里修改的是 xargs 的分隔符
1 | cat txt |xargs -i -p echo {}echo /bin tao shou kun ?...y |
-x exit 的意思,主要是配合 -s 使用。
-P 修改最大的进程数,默认是1,为0时候为 as many as it can
locate命令
locate 命令其实是 “find -name” 的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux 系统自动创建这个数据库,并且每天自动更新一次,所以使用 locate 命令查不到最新变动过的文件。为了避免这种情况,可以在使用 locate 之前,先使用 updatedb 命令,手动更新数据库。
locate命令的使用实例:
1 | # 搜索etc目录下所有以sh开头的文件。 |
whereis命令
whereis 命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。
whereis 命令的使用实例:
1 | whereis grep |
which命令
which 命令的作用是,在 PATH 变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用 which 命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
which 命令的使用实例:
1 | which grep |






