• 每天一个Linux命令(20)find命令_exec参数


        find命令的exec参数,用于find查找命令完成以后的后续操作。

        (1)用法:

        用法:  [find命令]  [-exec  其他命令 {} ;] 

        (2)功能:

        功能:-exec find命令对匹配的文件执行该参数所给出的其他linux命令。

        (3)-exec的解释:

        -exec参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的 考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。

        {}   花括号代表前面find查找出来的文件名。

        (4)实例:

          1)[root@localhost Documents]# find -type f -exec ls -l {} ;              将查找出来的结果用ls -l命令列出

    [root@localhost sunjimeng]# cd Documents
    [root@localhost Documents]# ll                    //ll命令等价于 ls -l
    总用量 20
    drwxr-xr-x. 2 root root  71 5月  17 04:18 findDir
    -rw-r--r--. 1 root root 664 5月   9 07:59 head_text
    -rw-r--r--. 1 root root  45 5月   9 08:15 less1
    -rw-r--r--. 1 root root  57 5月   9 08:16 less2
    -rw-r--r--. 1 root root   0 5月  15 18:21 newlocate
    -rw-r--r--. 1 root root 259 5月  12 21:53 tail_text
    -rw-r--r--. 1 root root 216 5月  12 22:24 tempory
    -rw-r--r--. 1 root root   0 5月  15 18:34 uText
    [root@localhost Documents]# find -type f -exec ls -l {} ;   //这里与直接执行ls -l命令不同的是,find命令会递归地将所有当前要查询的文件的子目录进行遍历,将每个后代文件均输出。
    -rw-r--r--. 1 root root 45 5月   9 08:15 ./less1
    -rw-r--r--. 1 root root 57 5月   9 08:16 ./less2
    -rw-r--r--. 1 root root 664 5月   9 07:59 ./head_text
    -rw-r--r--. 1 root root 259 5月  12 21:53 ./tail_text
    -rw-r--r--. 1 root root 216 5月  12 22:24 ./tempory
    -rw-r--r--. 1 root root 0 5月  15 18:21 ./newlocate
    -rw-r--r--. 1 root root 0 5月  15 18:34 ./uText               //只输出文件,却没有输出文件夹
    -rw-r--r--. 1 root root 0 5月  17 03:50 ./findDir/t1.txt
    -rw-r--r--. 1 root root 0 5月  17 04:02 ./findDir/T1.txt
    -rw-r--r--. 1 root root 0 5月  17 04:02 ./findDir/T2.txt
    -rw-r--r--. 1 root root 0 5月  17 04:18 ./findDir/p1.pdf
    -rw-r--r--. 1 root root 0 5月  17 04:18 ./findDir/p2.pdf
    [root@localhost Documents]# 

         -type d与-type f的区别:

    [root@localhost Documents]# find -type d -exec ls -l {} ;     //这里没有显示相对的路径
    总用量 20
    drwxr-xr-x. 2 root root  71 5月  17 04:18 findDir
    -rw-r--r--. 1 root root 664 5月   9 07:59 head_text
    -rw-r--r--. 1 root root  45 5月   9 08:15 less1
    -rw-r--r--. 1 root root  57 5月   9 08:16 less2
    -rw-r--r--. 1 root root   0 5月  15 18:21 newlocate
    -rw-r--r--. 1 root root 259 5月  12 21:53 tail_text
    -rw-r--r--. 1 root root 216 5月  12 22:24 tempory
    -rw-r--r--. 1 root root   0 5月  15 18:34 uText
    总用量 0
    -rw-r--r--. 1 root root 0 5月  17 04:18 p1.pdf
    -rw-r--r--. 1 root root 0 5月  17 04:18 p2.pdf
    -rw-r--r--. 1 root root 0 5月  17 03:50 t1.txt
    -rw-r--r--. 1 root root 0 5月  17 04:02 T1.txt
    -rw-r--r--. 1 root root 0 5月  17 04:02 T2.txt

          2)[root@localhost Document]# find . -type f -mtime +10 -exec rm -i {} ;        删除10天以外修改过的文件,删除时给出提醒

    [root@localhost Document]# find . -type f -mtime +14 -exec rm -i {} ;      由+14给出后没有反应,而给参数+10之后有反应,可知这些文件是10到14天以前建立或修改过的
    [root@localhost Document]# find . -type f -mtime +10 -exec rm -i {} ;
    rm:是否删除普通空文件 "./newDir/text1"?n
    rm:是否删除普通空文件 "./newDir/text2"?n
    rm:是否删除普通空文件 "./text1/newDir/text1"?n
    rm:是否删除普通空文件 "./text1/newDir/text2"?n
    rm:是否删除普通空文件 "./text2/newDir/text1"?n
    rm:是否删除普通空文件 "./text2/newDir/text2"?n
    rm:是否删除普通空文件 "./text3/text1"?n
    rm:是否删除普通空文件 "./text3/text2"?n
    rm:是否删除普通空文件 "./text4/text1"?n
    rm:是否删除普通空文件 "./text4/text2"?n
    rm:是否删除普通空文件 "./mytext"?n
    rm:是否删除普通空文件 "./mytext.txt"?n

          3)[root@localhost Document]# find . -type f -mtime +10 -ok rm {} ;            另一种方法实现删除时的交互

    [root@localhost Document]# find . -type f -mtime +10 -ok rm {} ;
    < rm ... ./newDir/text1 > ? n
    < rm ... ./newDir/text2 > ? n
    < rm ... ./text1/newDir/text1 > ? n
    < rm ... ./text1/newDir/text2 > ? n
    < rm ... ./text2/newDir/text1 > ? n
    < rm ... ./text2/newDir/text2 > ? n
    < rm ... ./text3/text1 > ? n
    < rm ... ./text3/text2 > ? n
    < rm ... ./text4/text1 > ? n
    < rm ... ./text4/text2 > ? n
    < rm ... ./mytext > ? n
    < rm ... ./mytext.txt > ? n

          4)[root@localhost Document]# find /etc -name "passwd*" -exec grep "root" {} ;      查看查询出来的文件中有没有root用户

    [root@localhost Document]# ll                          //此目录下有用户文件,也有root文件
    总用量 0
    -rw-rw-r--. 1 sunjimeng sunjimeng  0 5月  18 02:24 grepTest
    -rw-r--r--. 1 root      root       0 5月   6 22:15 mytext
    -rw-r--r--. 1 root      root       0 5月   6 22:15 mytext.txt
    drwxr-xr-x. 2 root      root      30 5月   6 22:02 newDir
    -rw-rw-r--. 1 sunjimeng sunjimeng  0 5月  18 02:34 userfile
    [root@localhost Document]# find /etc -name "passwd*" -exec grep "root" {} ;         //用grep命令查看在这些文件中是否存在一个root用户。(不太清楚什么意思)
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    [root@localhost Document]# find . -type f -exec grep "root" {} ;            //然而用这个命令,一点反应没有!

          5)[root@localhost Document]# find . -name "mv*" -exec mv {} newDir ;          将查询到的内容移动到newDir目录下

    [root@localhost Document]# ls
    newDir
    [root@localhost Document]# touch {mvt1.txt,mvt2.txt,mvt3.txt}
    [root@localhost Document]# find . -name "mv*" -exec ls -l {} ;
    -rw-r--r--. 1 root root 0 5月  18 02:46 ./mvt1.txt
    -rw-r--r--. 1 root root 0 5月  18 02:46 ./mvt2.txt
    -rw-r--r--. 1 root root 0 5月  18 02:46 ./mvt3.txt
    [root@localhost Document]# find . -name "mv*" -exec mv newDir {} ;  //注意顺序不要弄错
    mv: 无法以目录"newDir" 来覆盖非目录"./mvt1.txt"
    mv: 无法以目录"newDir" 来覆盖非目录"./mvt2.txt"
    mv: 无法以目录"newDir" 来覆盖非目录"./mvt3.txt"
    [root@localhost Document]# find . -name "mv*" -exec mv {} newDir ;    //mv命令将前面的文件集移动到后面的文件夹中
    [root@localhost Document]# ll
    总用量 0
    drwxr-xr-x. 2 root root 51 5月  18 02:47 newDir
    [root@localhost Document]# ls -l ./newDir
    总用量 0
    -rw-r--r--. 1 root root 0 5月  18 02:46 mvt1.txt
    -rw-r--r--. 1 root root 0 5月  18 02:46 mvt2.txt
    -rw-r--r--. 1 root root 0 5月  18 02:46 mvt3.txt

          6)[root@localhost sunjimeng]# find . -name "t*.txt" -mtime -1 -exec cat {} ; > ./Document/all.txt   合并查询到的多个文件的文本内容到一个新的文件

    [root@localhost Document]# ll            //查看当前目录
    总用量 0
    drwxr-xr-x. 2 root root 51 5月  18 02:47 newDir
    [root@localhost Document]# cat >t1.txt <<EOF     //新建t1.txt
    > this is t1.txt!
    > I'm testing -exec option!
    > EOF
    [root@localhost Document]# cat >t2.txt <<EOF     //新建t2.txt
    > this is t2.txt!
    > I'm testing -exec optioin!
    > EOF
    [root@localhost Document]# cd ../
    [root@localhost sunjimeng]# find -name "t*.txt" -exec ls -l {} ;             //查出了很多,前几项红的不是我们要的
    -rw-rw-r--. 1 sunjimeng sunjimeng 58 5月   4 21:45 ./.local/share/Trash/files/test1.txt
    -rw-rw-r--. 1 sunjimeng sunjimeng 61 5月   4 21:46 ./.local/share/Trash/files/test2.txt
    -rw-rw-r--. 1 sunjimeng sunjimeng 61 5月   4 21:47 ./.local/share/Trash/files/test3.txt-rw-r--r--. 1 root root 42 5月  18 02:53 ./Document/t1.txt
    -rw-r--r--. 1 root root 43 5月  18 02:54 ./Document/t2.txt
    [root@localhost sunjimeng]# find -name "t*.txt" -mtime -1 -exec ls -l {} ;   //加上日期限制为一天以内修改过的之后,显示正确的文件-rw-r--r--. 1 root root 42 5月  18 02:53 ./Document/t1.txt
    -rw-r--r--. 1 root root 43 5月  18 02:54 ./Document/t2.txt
    [root@localhost sunjimeng]# find . -name "t*.txt" -mtime -1 -exec cat {} ; > ./Document/all.txt   //将文件输出到当前子目录Document下的all.txt文件中,如果不存在则创建
    [root@localhost sunjimeng]# cat ./Document/all.txt
    this is t1.txt!
    I'm testing -exec option!
    this is t2.txt!
    I'm testing -exec optioin!

          7)[root@localhost sunjimeng]# find ./Documents -type f -name "*.txt" -exec printf "File: %s " {} ;    将查询到的文件当作字符数组,用类似c语言的printf的形式控制格式输出

    [root@localhost sunjimeng]# find ./Documents -type f -name "*.txt" -exec printf "File: %s
    " {} ; 
    File: ./Documents/findDir/t1.txt
    File: ./Documents/findDir/T1.txt
    File: ./Documents/findDir/T2.txt
    [root@localhost sunjimeng]# find ./Documents -type f -name "*.txt" -exec printf "File: %s
    
    " {} ;  //也可以多加一个
    
    File: ./Documents/findDir/t1.txt
    
    File: ./Documents/findDir/T1.txt
    
    File: ./Documents/findDir/T2.txt
    
    [root@localhost sunjimeng]# 

          

        (4)其他:

        Linux中exec命令相关:

      bash shell的命令分为两类:外部命令和内部命令。外部命令是通过系统调用或独立的程序实现的,如sed、awk等等。内部命令是由特殊的文件格式(.def)所实现,如cd、history、exec等等。

        1. 系统调用exec是以新的进程去代替原来的进程,但进程的PID保持不变。因此,可以这样认为,exec系统调用并没有创建新的进程,只是替换了原来进程上下文的内容。原进程的代码段,数据段,堆栈段被新的进程所代替。

        fork的概念

         fork是linux的系统调用,用来创建子进程(child process)。子进程是父进程(parent process)的一个副本,从父进程那里获得一定的资源分配以及继承父进程的环境。子进程与父进程唯一不同的地方在于pid(process id)。

         一个进程主要包括以下几个方面的内容:

          (1)一个可以执行的程序

          (2) 与进程相关联的全部数据(包括变量,内存,缓冲区)

          (3)程序上下文(程序计数器PC,保存程序执行的位置)

        2. exec是一个函数簇,由6个函数组成,分别是以excl和execv打头的。 执行exec系统调用,一般都是这样,用fork()函数新建立一个进程,然后让进程去执行exec调用。我们知道,在fork()建立 新进程之后,父进各与子进程共享代码段,但数据空间是分开的,但父进程会把自己数据空间的内容copy到子进程中去,还有上 下文也会copy到子进程中去。而为了提高效率,采用一种写时copy的策略,即创建子进程的时候,并不copy父进程的地址空间, 父子进程拥有共同的地址空间,只有当子进程需要写入数据时(如向缓冲区写入数据),这时候会复制地址空间,复制缓冲区到子 进程中去。从而父子进程拥有独立的地址空间。而对于fork()之后执行exec后,这种策略能够很好的提高效率,如果一开始就 copy,那么exec之后,子进程的数据会被放弃,被新的进程所代替。

  • 相关阅读:
    0045算法笔记——【随机化算法】舍伍德随机化思想搜索有序表
    精进~如何成为很厉害的人
    哪些小习惯一旦养成终生受用?
    2016第24周四
    2016第24周三
    2016第24周二
    2016第24周一
    2016第23周日
    前端资源汇总
    2016第23周五
  • 原文地址:https://www.cnblogs.com/MenAngel/p/5506144.html
Copyright © 2020-2023  润新知