本文主要介绍了lsof, find, xargs命令的基本用法。
lsof命令lsof:list open files 列出已经打开的文件,文件可以是一个普通文件、目录、特殊的块文件、特殊的字符文件、可执行的文件、lib库文件、socket文件等。
用法:
lsof [options] [filename]
案例:
- lsof test.txt 表示显示打开test.txt文件的进程;
- lsof -c string 查找lsof显示结果中COMMAND列中包含string的程序所打开的文件;这里可以有多个-c,来显示多个进程打开的文件;
- lsof -p 33321 列出进程号为33321的进程打开的文件
- lsof -g 0 显示属于gid为0这个组成员所打开的文件
- lsof -u root|0 显示root用户(或是指定的UID的用户)所有打开的文件。
- lsof -u ^root 表示列出不属于root用户打开的文件;
- lsof d /tmp 显示/tmp目录下被打开的文件,注意这个只会在当前目录下找,不会去找指定目录的子目录。
- lsof D /usr/local 这个是在/usr/local目录及其子目录中去寻找已经打开了的文件
- lsof -d 4 显示正在使用文件描述符为4的进程
- lsof -a -u root -c mysqld表示显示root用户运行的mysqld程序打开的所有文件。-a表示and的意思,是两个条件都要满足
- lsof -i [46][protocol][@hostname|hostaddr][:service|port]显示指定的网络地址所属的进程打开的文件列表。[]中的内容为可选项
4|6表示的是要匹配的网络地址是ipv4,还是ipv6的
protocol表示网络地址所使用的传输层协议,有效值为TCP、UDP(不区分大小写)
hostname|hostaddr主机名或主机地址
service表示定义在/etc/services文件中的服务名称
port表示网络地址中的端口部分
例如:
lsof -i 4tcp@0.0.0.0:22
通过遍历指定目录中的所有文件查找,查找的条件丰富。
用法:find 查找路径 查找条件 查找到后的动作
查找路径:就是指在哪个路径中进行查找
查找条件
- -name ‘filename’ 是精确查找;区分大小写;
- -iname ‘filename’在查找的时候不区分文件名的大小写;
- -regex PATTERN 基于正则表达式来进行文件名的查找;
- -user username 查找属于username用户的文件;
- -group groupname 查找属于groupname组的文件;
- -gid gid 查找属于组id为gid的文件;
- -uid uid 查找属于用户id为uid的文件;
- -nouser 查找不属于任何用户的文件,即没有属主的文件;
- -nogroup 查找没有属组的文件;通常在用户和组都被删除了的情况,这里该用户的属主和属组为删除的这个用户的生前uid,gid
- -type type 根据文件的类型来查找;type可能有的值如下:
f 普通文件
d 目录
c 字符设备
b 块设备
l 链接文件
p 管道设备
s 套接字文件
- -size { |-}n{k|M|G} 根据文件的大小来查找;
10k 表示文件大小大于10k
-20M 表示文件大小小于20M,
10k 表示查找大小为10k的文件;
如果没有指定单位则默认是byte字节;
如果没有 或-,则表示精确匹配;
当要把多个查找条件组合起来的时候,要使用到下面的逻辑关系:
-a 表示并且;
-o 表示或;
-not 表示非;
默认情况下是 –a 也就是“并且”
根据文件的时间属性来查找:
-atime { |-}num
-mtime { |-}num
-ctime { |-}num
num 表示查找那些atime、mtime、ctime离此刻刚好有num天的文件;
-num 表示查找那些atime、mtime、ctime离此刻刚好在num天之内的文件;
num 表示查找那些atime、mtime、ctime离此刻至少有num天,也就是说num天之外的文件;
可以使用下面的这张图来说明:
-amin 最近访问过的时间,以分钟为单位;
-mmin 最近修改过的时间,以分钟为单位;
-cmin 最近改变过的时间,以分钟为单位;
-perm MODE 根据文件的权限来查找;755之类的 这是精确匹配,也就是说文件的权限必须是MODE,不多也不能少;
-perm /MODE 也是根据文件的权限来查找,只不过,只要有一个可以匹配,就算到找到的范围内;
-perm -MODE 每一位都必须匹配;也就是说当文件的权限完全包含MODE的时候,就算数;
-inum n 根据指定的文件的inode号来查找文件;可以用来删除那些中文乱码的文件。
先使用ls -li来找到乱码文件的inode,然后再使用find /path/ -inum x -exec rm -rf {} \; 这样就可以删除该文件了;
查找后的动作:
-print 默认动作,打印出来;
-ls 类型ls –l的形式来显示找到的文件的信息;
-ok command {} \; 在执行command的时候会提示用户是否执行,一定要写上\;结尾,{}是引用找到的那个文件,可以引用多次;
-exec command {} \; 同上,但是在执行command 的时候是不会提示用户的;
xargs命令xargs - 从标准输入接收命令并执行;
xargs 从标准输入读入参数,这些参数以空格、单双引号或者一个新行作为分隔符,然后xargs就会用后面的命令(默认是echo)带上这些参数来执行;从标准输入读入的空行将会被忽略;
由于类unix文件系统中文件名称可以包括空格、换行等特殊字符,所以默认的操作还是有些问题的。文件名中有空格、/和换行符的将不能被xargs正确的处理,考虑到这种情况,最好是使用-0 选项,它可以避免这些问题。当使用这个选项的时候,你必须确保为xargs产生参数的程序所产生的参数,必须也是以空字符来作为他隔符的。如果是用find为xargs产生参数,那么可以在find中使用-print0。
如果任何一个调用的命令以255状态码退出,那么,xargs将会立即停止,将不会读取后面的参数,并且会在标错误输出上显示错误信息。
案例:
- 把/tmp目录下,以.test结尾的普通文件全部删除。
# find /tmp -name ‘*.test’ -type f | xargs rm -f {}
上面这个命令只会删除文件名称中没有空格或是换行符的文件。像’a b.test’这个文件它是删除不了的。
- 再看下面这个命令:
# find /tmp -name ‘*.test’ -type f -print0 | xargs -0 rm -rf
这个命令就会把/tmp下面所以有.test结尾的文件全部删除;
,