find 命令grep、exec、xargs组合

    xiaoxiao2023-10-10  156

    首先了解基本命令:

    Linux 经常需要进行文件查找。其中查找的命令主要有find和grep。两个命令是有区的

     (1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。 

     (2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。

    一、find 命令:

    find path -option [ -print ] [ -exec -ok command ] {} \;

      部分参数说明: 

          -exec:对找到的文件执行exec这个参数所指定的shell命令,相应的形式为:-exec command {}   \; 将查到的文件进行command操作,”{}”就代替查到的文件。 

        -ok : 系统会让用户确定是否执行例子:

    #将目前目录及其子目录下所有最近 20 天内更新过的文件列出 find . -ctime -20 #查找/var/log目录中更改时间在7日以前的普通文件,并在删除之前询问它们: find /var/log -type f -mtime +7 -ok rm {} \; # 查找前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件: find . -type f -perm 644 -exec ls -l {} \; # 为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径: find / -type f -size 0 -exec ls -l {} \; #查找空文件夹 find -type d -empty

    二、 grep 命令:

           grep命令用于查找文件里符合条件的字符串 

           grep 用法略...

    三、xargs  命令:      

    somecommand |xargs -item command

          xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。

          xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行;

    参数说明:

    -a file 从文件中读入作为sdtin -e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。 -p 当每次执行一个argument的时候询问一次用户。 -n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。 -t 表示先打印命令,然后再执行。 -i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。 -r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。 -s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。 -L num 从标准输入一次读取 num 行送给 command 命令。 -l 同 -L。 -d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。 -x exit的意思,主要是配合-s使用。。 -P 修改最大的进程数,默认是1,为0时候为as many as it can ,这个例子我没有想到,应该平时都用不到的吧。 find . -name "*.txt" | xargs rm -rf {} find /home/ -iname "*.sh" |xargs -I {} ls -li {} #-i 表示 find 传递给xargs的结果 由{}来代替 find /root/ -type f -name "*.sh" | xargs -i cp {} /tmp/ #查找所有的jpg 文件,并且压缩它 find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz

    四、xargs 与 exec区别

    -exec      1.参数是一个一个传递的,传递一个参数执行一次,效率低      2.文件名有空格等特殊字符也能处理  -xargs       1.一次将参数传给命令,可以使用-n控制参数个数      2.处理特殊文件名需要采用如下方式:find . -name "*.txt" -print0 |xargs -0 rm {}   

         find -print0  与 xargs -0 的结合避免文件名有特殊字符如空格,引号等无法处理

     五、举例说明:

    #搜索文件中含有“resines”字符串 find . -name "*.text" | xargs grep resines #搜索文件名中含有的resines find . -name "*.text" | grep resines #xargs还有指定参数位置的作用。假设我们要将目录下所有的.py文件放到Python目录中去, #参数-I指定了管道前命令作为参数所应该在管道后面命令的位置。 find . -name '*.py' | xargs -I {} mv {} ./Python

     

    最新回复(0)