本文主要介绍了lsof, find, xargs命令的基本用法。

lsof命令

lsof:list open files 列出已经打开的文件,文件可以是一个普通文件、目录、特殊的块文件、特殊的字符文件、可执行的文件、lib库文件、socket文件等。

用法:

lsof [options] [filename]

案例:

4|6表示的是要匹配的网络地址是ipv4,还是ipv6的 protocol表示网络地址所使用的传输层协议,有效值为TCP、UDP(不区分大小写) hostname|hostaddr主机名或主机地址 service表示定义在/etc/services文件中的服务名称 port表示网络地址中的端口部分 例如: lsof -i 4tcp@0.0.0.0:22

find命令

通过遍历指定目录中的所有文件查找,查找的条件丰富。

用法:find 查找路径 查找条件 查找到后的动作

查找路径:就是指在哪个路径中进行查找

查找条件

f 普通文件

d 目录

c 字符设备

b 块设备

l 链接文件

p 管道设备

s 套接字文件

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天之外的文件;

可以使用下面的这张图来说明:

linux入门教程(超详细)(Linux入门系列lsof)(1)

-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将会立即停止,将不会读取后面的参数,并且会在标错误输出上显示错误信息。

案例:

# 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结尾的文件全部删除;

,