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

本文主要介绍了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命令

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

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

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

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

案例:

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

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页