linux的find跟cp命令 - CSDN
精华内容
参与话题
  • linuxfindcp命令的结合

    千次阅读 2011-09-20 19:35:37
    如: find 路径 -name "*.c" -exec cp {} 目标目录 \;
    如: find 路径 -name "*.c" -exec cp {} 目标目录 \;
    
    展开全文
  • find命令 1.命令格式: find pathname -options [-print -exec -ok ...] 2.命令功能: 用于在文件树种查找文件,并作出相应的处理  3.命令参数: pathname: find命令所查找的目录路径。例如用.来...

    find命令

    1.命令格式:

    find pathname -options [-print -exec -ok ...]

    2.命令功能:

    用于在文件树种查找文件,并作出相应的处理 

    3.命令参数:

    pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 

    -print: find命令将匹配的文件输出到标准输出。 

    参数详解

    find一些常用参数的一些常用实例和一些具体用法和注意事项。

    1.使用name选项:

    文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。  可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。  不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.log的文件,使用~作为 'pathname'参数,波浪号~代表了你的$HOME目录。

    find ~ -name "*.log" -print  

    想要在当前目录及子目录中查找所有的‘ *.log‘文件,可以用: 

    find . -name "*.log" -print  

    想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:  

    find . -name "[A-Z]*" -print  

    想要在/etc目录中查找文件名以host开头的文件,可以用:  

    find /etc -name "host*" -print  

    想要查找$HOME目录中的文件,可以用:  

    find ~ -name "*" -print 或find . -print  

    要想让系统高负荷运行,就从根目录开始查找所有的文件。  

    find / -name "*" -print  

    如果想在当前目录查找文件名以一个个小写字母开头,最后是4到9加上.log结束的文件:  

    命令:

    find . -name "[a-z]*[4-9].log" -print

    输出:

    [root@localhost test]# ll

    总计 316

    -rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log

    -rw-r--r-- 1 root root     61 11-13 06:03 log2013.log

    -rw-r--r-- 1 root root      0 11-13 06:03 log2014.log

    -rw-r--r-- 1 root root      0 11-13 06:06 log2015.log

    drwxr-xr-x 6 root root   4096 10-27 01:58 scf

    drwxrwxr-x 2 root root   4096 11-13 06:08 test3

    drwxrwxr-x 2 root root   4096 11-13 05:50 test4

    [root@localhost test]# find . -name "[a-z]*[4-9].log" -print

    ./log2014.log

    ./log2015.log

    ./test4/log2014.log

    [root@localhost test]#

     

    2.用perm选项:

    按照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好使用八进制的权限表示法。  

    如在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:  

    [root@localhost test]# find . -perm 755 -print

    .

    ./scf

    ./scf/lib

    ./scf/service

    ./scf/service/deploy

    ./scf/service/deploy/product

    ./scf/service/deploy/info

    ./scf/doc

    ./scf/bin

    [root@localhost test]#

     

    还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-005相当于555,

    命令:

    find . -perm -005

    输出:

    [root@localhost test]# ll

    总计 316

    -rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log

    -rw-r--r-- 1 root root     61 11-13 06:03 log2013.log

    -rw-r--r-- 1 root root      0 11-13 06:03 log2014.log

    -rw-r--r-- 1 root root      0 11-13 06:06 log2015.log

    drwxr-xr-x 6 root root   4096 10-27 01:58 scf

    drwxrwxr-x 2 root root   4096 11-13 06:08 test3

    drwxrwxr-x 2 root root   4096 11-13 05:50 test4

    [root@localhost test]# find . -perm -005

    .

    ./test4

    ./scf

    ./scf/lib

    ./scf/service

    ./scf/service/deploy

    ./scf/service/deploy/product

    ./scf/service/deploy/info

    ./scf/doc

    ./scf/bin

    ./test3

    [root@localhost test]#

     

    3.忽略某个目录:

    如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。如果希望在test目录下查找文件,但不希望在test/test3目录下查找,可以用:  

    命令:

    find test -path "test/test3" -prune -o -print

    输出:

    [root@localhost soft]# find test -path "test/test3" -prune -o -print

    test

    test/log2014.log

    test/log2015.log

    test/test4

    test/test4/log2014.log

    test/test4/log2013.log

    test/test4/log2012.log

    test/scf

    test/scf/lib

    test/scf/service

    test/scf/service/deploy

    test/scf/service/deploy/product

    test/scf/service/deploy/info

    test/scf/doc

    test/scf/bin

    test/log2013.log

    test/log2012.log

    [root@localhost soft]#

     

    4.使用find查找文件的时候怎么避开某个文件目录: 

    实例1:在test 目录下查找不在test4子目录之内的所有文件

    命令:

    find test -path "test/test4" -prune -o -print

    输出:

    [root@localhost soft]# find test

    test

    test/log2014.log

    test/log2015.log

    test/test4

    test/test4/log2014.log

    test/test4/log2013.log

    test/test4/log2012.log

    test/scf

    test/scf/lib

    test/scf/service

    test/scf/service/deploy

    test/scf/service/deploy/product

    test/scf/service/deploy/info

    test/scf/doc

    test/scf/bin

    test/log2013.log

    test/log2012.log

    test/test3

    [root@localhost soft]# find test -path "test/test4" -prune -o -print

    test

    test/log2014.log

    test/log2015.log

    test/scf

    test/scf/lib

    test/scf/service

    test/scf/service/deploy

    test/scf/service/deploy/product

    test/scf/service/deploy/info

    test/scf/doc

    test/scf/bin

    test/log2013.log

    test/log2012.log

    test/test3

    [root@localhost soft]#

     

    说明:

    find [-path ..] [expression] 

    在路径列表的后面的是表达式 

    -path "test" -prune -o -print 是 -path "test" -a -prune -o -print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果 

    -path "test" 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path "test" -a -prune 为假,则求值 -print ,-print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。 

    这个表达式组合特例可以用伪码写为:

    if -path "test" then  

    -prune  

    else  

    -print  

     

    实例2:避开多个文件夹:

    命令:

    find test \( -path test/test4 -o -path test/test3 \) -prune -o -print 

    输出:

    [root@localhost soft]# find test \( -path test/test4 -o -path test/test3 \) -prune -o -print

    test

    test/log2014.log

    test/log2015.log

    test/scf

    test/scf/lib

    test/scf/service

    test/scf/service/deploy

    test/scf/service/deploy/product

    test/scf/service/deploy/info

    test/scf/doc

    test/scf/bin

    test/log2013.log

    test/log2012.log

    [root@localhost soft]#

     

    说明:

    圆括号表示表达式的结合。  \ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。  

    实例3:查找某一确定文件,-name等选项加在-o 之后

    命令:

    find test \(-path test/test4 -o -path test/test3 \) -prune -o -name "*.log" -print

    输出:

    [root@localhost soft]# find test \( -path test/test4 -o -path test/test3 \) -prune -o -name "*.log" -print

    test/log2014.log

    test/log2015.log

    test/log2013.log

    test/log2012.log

    [root@localhost soft]#

     

    5.使用user和nouser选项:

    按文件属主查找文件:

    实例1:在$HOME目录中查找文件属主为peida的文件 

    命令:

    find ~ -user peida -print  

    实例2:在/etc目录下查找文件属主为peida的文件: 

    命令:

    find /etc -user peida -print  

    说明:

    实例3:为了查找属主帐户已经被删除的文件,可以使用-nouser选项。在/home目录下查找所有的这类文件

    命令:

    find /home -nouser -print

    说明:

    这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名; find命令能够为你完成相应的工作。

     

    6.使用group和nogroup选项:

    就像user和nouser选项一样,针对文件所属于的用户组, find命令也具有同样的选项,为了在/apps目录下查找属于gem用户组的文件,可以用:  

    find /apps -group gem -print  

    要查找没有有效所属用户组的所有文件,可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件:

    find / -nogroup-print

     

    7.按照更改时间或访问时间等查找文件:

    如果希望按照更改时间来查找文件,可以使用mtime,atime或ctime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选项来查找这样的文件。  

    用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。  

    希望在系统根目录下查找更改时间在5日以内的文件,可以用:

    find / -mtime -5 -print

    为了在/var/adm目录下查找更改时间在3日以前的文件,可以用:

    find /var/adm -mtime +3 -print

     

    8.查找比某个文件新或旧的文件:

    如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项。

    它的一般形式为:  

    newest_file_name ! oldest_file_name  

    其中,!是逻辑非符号。  

    实例1:查找更改时间比文件log2012.log新但比文件log2017.log旧的文件

    命令:

    find -newer log2012.log ! -newer log2017.log

    输出:

    [root@localhost test]# ll

    总计 316

    -rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log

    -rw-r--r-- 1 root root     61 11-13 06:03 log2013.log

    -rw-r--r-- 1 root root      0 11-13 06:03 log2014.log

    -rw-r--r-- 1 root root      0 11-13 06:06 log2015.log

    -rw-r--r-- 1 root root      0 11-16 14:41 log2016.log

    -rw-r--r-- 1 root root      0 11-16 14:43 log2017.log

    drwxr-xr-x 6 root root   4096 10-27 01:58 scf

    drwxrwxr-x 2 root root   4096 11-13 06:08 test3

    drwxrwxr-x 2 root root   4096 11-13 05:50 test4

    [root@localhost test]# find -newer log2012.log ! -newer log2017.log

    .

    ./log2015.log

    ./log2017.log

    ./log2016.log

    ./test3

    [root@localhost test]#

     

    实例2:查找更改时间在比log2012.log文件新的文件  

    命令:

    find . -newer log2012.log -print

    输出:

    [root@localhost test]# find -newer log2012.log

    .

    ./log2015.log

    ./log2017.log

    ./log2016.log

    ./test3

    [root@localhost test]#

     

    9.使用type选项:

    实例1:在/etc目录下查找所有的目录  

    命令:

    find /etc -type d -print  

    实例2:在当前目录下查找除目录以外的所有类型的文件  

    命令:

    find . ! -type d -print  

    实例3:在/etc目录下查找所有的符号链接文件

    命令:

    find /etc -type l -print

     

    10.使用size选项:

    可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字表示即可。  

    在按照文件长度查找文件时,一般使用这种以字节表示的文件长度,在查看文件系统的大小,因为这时使用块来计量更容易转换。  

    实例1:在当前目录下查找文件长度大于1 M字节的文件  

    命令:

    find . -size +1000000c -print

    实例2:在/home/apache目录下查找文件长度恰好为100字节的文件:  

    命令:

    find /home/apache -size 100c -print  

    实例3:在当前目录下查找长度超过10块的文件(一块等于512字节) 

    命令:

    find . -size +10 -print

     

    11.使用depth选项:

    在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。  

    实例1:find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。   

    命令:

    find / -name "CON.FILE" -depth -print

    说明:

    它将首先匹配所有的文件然后再进入子目录中查找

    12.使用mount选项: 

      在当前的文件系统中查找文件(不进入其他文件系统),可以使用find命令的mount选项。

    实例1:从当前目录开始查找位于本文件系统中文件名以XC结尾的文件  

    命令:

    find . -name "*.XC" -mount -print

    -exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {  } \;,注意{   }和\;之间的空格。 

    exec解释:

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

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

    使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的。在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。 exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名

    实例1:ls -l命令放在find命令的-exec选项中 

    命令:

    find . -type f -exec ls -l {} \;

    输出: 

    [root@localhost test]# find . -type f -exec ls -l {} \; 

    -rw-r--r-- 1 root root 127 10-28 16:51 ./log2014.log

    -rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-2.log

    说明: 

    上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l命令将它们列出。

    实例2:在目录中查找更改时间在n日以前的文件并删除它们

    命令:

    find . -type f -mtime +14 -exec rm {} \; 

    输出:

    [root@localhost test]# ll

    总计 328

    -rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

    -rw-r--r-- 1 root root     33 10-28 16:54 log2013.log

    -rw-r--r-- 1 root root    127 10-28 16:51 log2014.log

    lrwxrwxrwx 1 root root      7 10-28 15:18 log_link.log -> log.log

    说明:

    在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。 

    实例4:-exec中使用grep命令

    命令:

    find /etc -name "passwd*" -exec grep "root" {} \;

    输出:

    [root@localhost test]# find /etc -name "passwd*" -exec grep "root" {} \;

    root:x:0:0:root:/root:/bin/bash

    root:x:0:0:root:/root:/bin/bash

    [root@localhost test]#

    说明:

    任何形式的命令都可以在-exec选项中使用。  在上面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个root用户。

    实例5:查找文件移动到指定目录  

    命令:

    find . -name "*.log" -exec mv {} .. \;

    输出:

    [root@localhost test]# ll

    总计 12drwxr-xr-x 6 root root 4096 10-27 01:58 scf

    drwxrwxr-x 2 root root 4096 11-12 22:49 test3

    drwxrwxr-x 2 root root 4096 11-12 19:32 test4

    实例6:用exec选项执行cp命令  

    命令:

    find . -name "*.log" -exec cp {} test3 \;

    输出:

    [root@localhost test3]# ll

    总计 0[root@localhost test3]# cd ..

    [root@localhost test]# ll

    总计 316

    -rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

    -rw-r--r-- 1 root root     61 11-12 22:44 log2013.log

    -rw-r--r-- 1 root root      0 11-12 22:25 log2014.lo

    -ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

    实例3:在目录中查找更改时间在n日以前的文件并删除它们,在删除之前先给出提示

    命令:

    find . -name "*.log" -mtime +5 -ok rm {} \;

    输出:

    [root@localhost test]# ll

    总计 312

    -rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

    lrwxrwxrwx 1 root root      7 10-28 15:18 log_link.log -> log.log

    drwxr-xr-x 6 root root   4096 10-27 01:58 scf

    drwxrwxrwx 2 root root   4096 11-12 19:32 test3

    [root@localhost test]# find . -name "*.log" -mtime +5 -ok rm {} \;

    < rm ... ./log_link.log > ? y

    < rm ... ./log2012.log > ? n

    [root@localhost test]# ll

    总计 312

    -rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

    drwxr-xr-x 6 root root   4096 10-27 01:58 scf

    说明:

    在上面的例子中, find命令在当前目录中查找所有文件名以.log结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。 按y键删除文件,按n键不删除。 

    4.命令选项:

    -name   按照文件名查找文件。

    -perm   按照文件权限来查找文件。

    -prune  使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。

    -user   按照文件属主来查找文件。

    -group  按照文件所属的组来查找文件。

    -mtime -n +n  按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。

    -nogroup  查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。

    -nouser   查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。

    -newer file1 ! file2  查找更改时间比文件file1新但比文件file2旧的文件。

    -type  查找某一类型的文件,诸如:

    b - 块设备文件。

    d - 目录。

    c - 字符设备文件。

    p - 管道文件。

    l - 符号链接文件。

    f - 普通文件。

    -size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。

    -fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。

    -mount:在查找文件时不跨越文件系统mount点。

    -follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。

    -cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。

    另外,下面三个的区别:

    -amin n   查找系统中最后N分钟访问的文件

    -atime n  查找系统中最后n*24小时访问的文件

    -cmin n   查找系统中最后N分钟被改变文件状态的文件

    -ctime n  查找系统中最后n*24小时被改变文件状态的文件

    -mmin n   查找系统中最后N分钟被改变文件数据的文件

    -mtime n  查找系统中最后n*24小时被改变文件数据的文件

    5.使用实例:

    实例1:查找指定时间内修改过的文件 

    命令:

               find -atime -2

    输出:

    [root@peidachang ~]# find -atime -2

    .

    ./logs/monitor

    ./.bashrc

    ./.bash_profile

    ./.bash_history

    说明:

    超找48小时内修改过的文件 

    实例2:根据关键字查找 

    命令:

    find . -name "*.log"

    输出:

    [root@localhost test]# find . -name "*.log" 

    ./log_link.log

    ./log2014.log

    ./test4/log3-2.log

    ./test4/log3-3.log

    ./test4/log3-1.log

    ./log2013.log

    ./log2012.log

    ./log.log

    ./test5/log5-2.log

    ./test5/log5-3.log

    ./test5/log.log

    ./test5/log5-1.log

    ./test5/test3/log3-2.log

    ./test5/test3/log3-3.log

    ./test5/test3/log3-1.log

    ./test3/log3-2.log

    ./test3/log3-3.log

    ./test3/log3-1.log

    说明:

    在当前目录查找 以.log结尾的文件。 ". "代表当前目录 

    实例3:按照目录或文件的权限来查找文件

    命令:

    find /opt/soft/test/ -perm 777

    输出:

    [root@localhost test]# find /opt/soft/test/ -perm 777

    /opt/soft/test/log_link.log

    /opt/soft/test/test4

    /opt/soft/test/test5/test3

    /opt/soft/test/test3

    说明: 

    查找/opt/soft/test/目录下 权限为 777的文件

    实例4:按类型查找 

    命令:

    find . -type f -name "*.log"

    输出:

    [root@localhost test]# find . -type f -name "*.log"

    ./log2014.log

    ./test4/log3-2.log

    ./test4/log3-3.log

    ./test4/log3-1.log

    ./log2013.log

    ./log2012.log

    ./log.log

    ./test5/log5-2.log

    ./test5/log5-3.log

    ./test5/log.log

    ./test5/log5-1.log

    ./test5/test3/log3-2.log

    ./test5/test3/log3-3.log

    ./test5/test3/log3-1.log

    ./test3/log3-2.log

    ./test3/log3-3.log

    ./test3/log3-1.log

    [root@localhost test]#

    说明:

    查找当目录,以.log结尾的普通文件 

    实例5:查找当前所有目录并排序

    命令:

    find . -type d | sort

    输出:

    [root@localhost test]# find . -type d | sort

    .

    ./scf

    ./scf/bin

    ./scf/doc

    ./scf/lib

    ./scf/service

    ./scf/service/deploy

    ./scf/service/deploy/info

    ./scf/service/deploy/product

    ./test3

    ./test4

    ./test5

    ./test5/test3

    [root@localhost test]#

    实例6:按大小查找文件

    命令:

    find . -size +1000c -print

    输出:

    [root@localhost test]#  find . -size +1000c -print

    .

    ./test4

    ./scf

    ./scf/lib

    ./scf/service

    ./scf/service/deploy

    ./scf/service/deploy/product

    ./scf/service/deploy/info

    ./scf/doc

    ./scf/bin

    ./log2012.log

    ./test5

    ./test5/test3

    ./test3

    [root@localhost test]#

    说明:

    查找当前目录大于1K的文件

    在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。  

    find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。  

    在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高; 而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

    使用实例:

    实例1: 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件 

    命令:

    find . -type f -print | xargs file

    输出:

    [root@localhost test]# ll

    总计 312

    -rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

    -rw-r--r-- 1 root root      0 11-12 22:25 log2013.log

    -rw-r--r-- 1 root root      0 11-12 22:25 log2014.log

    drwxr-xr-x 6 root root   4096 10-27 01:58 scf

    drwxrwxrwx 2 root root   4096 11-12 19:32 test3

    drwxrwxrwx 2 root root   4096 11-12 19:32 test4

    [root@localhost test]# find . -type f -print | xargs file

    ./log2014.log: empty

    ./log2013.log: empty

    ./log2012.log: ASCII text

    [root@localhost test]#

     

    实例2:在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中

    命令:

     find / -name "core" -print | xargs echo "" >/tmp/core.log

    输出:

    [root@localhost test]# find / -name "core" -print | xargs echo "" >/tmp/core.log

    [root@localhost test]# cd /tmp

    [root@localhost tmp]# ll

    总计 16

    -rw-r--r-- 1 root root 1524 11-12 22:29 core.log

    drwx------ 2 root root 4096 11-12 22:24 ssh-TzcZDx1766

    drwx------ 2 root root 4096 11-12 22:28 ssh-ykiRPk1815

    drwx------ 2 root root 4096 11-03 07:11 vmware-root

     

    实例3:在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限

    命令:

    find . -perm -7 -print | xargs chmod o-w

    输出:

    [root@localhost test]# ll

    总计 312

    -rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

    -rw-r--r-- 1 root root      0 11-12 22:25 log2013.log

    -rw-r--r-- 1 root root      0 11-12 22:25 log2014.log

    drwxr-xr-x 6 root root   4096 10-27 01:58 scf

    drwxrwxrwx 2 root root   4096 11-12 19:32 test3

    drwxrwxrwx 2 root root   4096 11-12 19:32 test4

    [root@localhost test]# find . -perm -7 -print | xargs chmod o-w

    [root@localhost test]# ll

    总计 312

    -rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

    -rw-r--r-- 1 root root      0 11-12 22:25 log2013.log

    -rw-r--r-- 1 root root      0 11-12 22:25 log2014.log

    drwxr-xr-x 6 root root   4096 10-27 01:58 scf

    drwxrwxr-x 2 root root   4096 11-12 19:32 test3

    drwxrwxr-x 2 root root   4096 11-12 19:32 test4

    [root@localhost test]#

    说明:

    执行命令后,文件夹scf、test3和test4的权限都发生改变

     

    实例4:用grep命令在所有的普通文件中搜索hostname这个词

    命令:

    find . -type f -print | xargs grep "hostname"

    输出:

    [root@localhost test]# find . -type f -print | xargs grep "hostname"

    ./log2013.log:hostnamebaidu=baidu.com

    ./log2013.log:hostnamesina=sina.com

    ./log2013.log:hostnames=true[root@localhost test]#

     

    实例5:用grep命令在当前目录下的所有普通文件中搜索hostnames这个词

    命令:

    find . -name \* -type f -print | xargs grep "hostnames"

    输出:

    [root@peida test]# find . -name \* -type f -print | xargs grep "hostnames"

    ./log2013.log:hostnamesina=sina.com

    ./log2013.log:hostnames=true[root@localhost test]#

     

    说明:

    注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。  

     

    实例6:使用xargs执行mv 

    命令:

    find . -name "*.log" | xargs -i mv {} test4

    输出:

    [root@localhost test]# ll

    总计 316

    -rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log

    -rw-r--r-- 1 root root     61 11-12 22:44 log2013.log

    -rw-r--r-- 1 root root      0 11-12 22:25 log2014.log

    drwxr-xr-x 6 root root   4096 10-27 01:58 scf

    drwxrwxr-x 2 root root   4096 11-12 22:54 test3

    drwxrwxr-x 2 root root   4096 11-12 19:32 test4

    [root@localhost test]# cd test4/

    [root@localhost test4]# ll

    总计 0[root@localhost test4]# cd ..

    [root@localhost test]# find . -name "*.log" | xargs -i mv {} test4

    [root@localhost test]# ll

    总计 12drwxr-xr-x 6 root root 4096 10-27 01:58 scf

    drwxrwxr-x 2 root root 4096 11-13 05:50 test3

    drwxrwxr-x 2 root root 4096 11-13 05:50 test4

    [root@localhost test]# cd test4/

    [root@localhost test4]# ll

    总计 304

    -rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log

    -rw-r--r-- 1 root root     61 11-12 22:54 log2013.log

    -rw-r--r-- 1 root root      0 11-12 22:54 log2014.log

    [root@localhost test4]#

     

    实例7:find后执行xargs提示xargs: argument line too long解决方法:

    命令:

    find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f

    输出:

    [root@pd test4]#  find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f

    rm -f 

    [root@pdtest4]#

    说明:

    -l1是一次处理一个;-t是处理之前打印出命令

     

    实例8:使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[] 

    命令:

    输出:

    [root@localhost test]# ll

    总计 12drwxr-xr-x 6 root root 4096 10-27 01:58 scf

    drwxrwxr-x 2 root root 4096 11-13 05:50 test3

    drwxrwxr-x 2 root root 4096 11-13 05:50 test4

    [root@localhost test]# cd test4

    [root@localhost test4]# find . -name "file" | xargs -I [] cp [] ..

    [root@localhost test4]# ll

    总计 304

    -rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log

    -rw-r--r-- 1 root root     61 11-12 22:54 log2013.log

    -rw-r--r-- 1 root root      0 11-12 22:54 log2014.log

    [root@localhost test4]# cd ..

    [root@localhost test]# ll

    总计 316

    -rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log

    -rw-r--r-- 1 root root     61 11-13 06:03 log2013.log

    -rw-r--r-- 1 root root      0 11-13 06:03 log2014.log

    drwxr-xr-x 6 root root   4096 10-27 01:58 scf

    drwxrwxr-x 2 root root   4096 11-13 05:50 test3

    drwxrwxr-x 2 root root   4096 11-13 05:50 test4

    [root@localhost test]#

    说明:

    使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[] 

     

    实例9:xargs的-p参数的使用 

    命令:

    find . -name "*.log" | xargs -p -i mv {} ..

    输出:

    [root@localhost test3]# ll

    总计 0

    -rw-r--r-- 1 root root 0 11-13 06:06 log2015.log

    [root@localhost test3]# cd ..

    [root@localhost test]# ll

    总计 316

    -rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log

    -rw-r--r-- 1 root root     61 11-13 06:03 log2013.log

    -rw-r--r-- 1 root root      0 11-13 06:03 log2014.log

    drwxr-xr-x 6 root root   4096 10-27 01:58 scf

    drwxrwxr-x 2 root root   4096 11-13 06:06 test3

    drwxrwxr-x 2 root root   4096 11-13 05:50 test4

    [root@localhost test]# cd test3

    [root@localhost test3]#  find . -name "*.log" | xargs -p -i mv {} ..

    mv ./log2015.log .. ?...y

    [root@localhost test3]# ll

    总计 0[root@localhost test3]# cd ..

    [root@localhost test]# ll

    总计 316

    -rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log

    -rw-r--r-- 1 root root     61 11-13 06:03 log2013.log

    -rw-r--r-- 1 root root      0 11-13 06:03 log2014.log

    -rw-r--r-- 1 root root      0 11-13 06:06 log2015.log

    drwxr-xr-x 6 root root   4096 10-27 01:58 scf

    drwxrwxr-x 2 root root   4096 11-13 06:08 test3

    drwxrwxr-x 2 root root   4096 11-13 05:50 test4

    [root@localhost test]#

    说明:

    -p参数会提示让你确认是否执行后面的命令,y执行,n不执行。

     

     

    展开全文
  • Linuxfind命令详解

    万次阅读 多人点赞 2018-08-01 10:37:34
    find命令格式: find path -option 【 -print 】 【 -exec -ok |xargs |grep 】 【 command {} \; 】 find命令的参数: 1)path:要查找的目录路径。   ~ 表示$HOME目录  . 表示当前目录  / 表示根目录...

    find命令格式:

    find   path  -option  【 -print 】  【 -exec   -ok   |xargs  |grep  】 【  command  {} \;  】

    find命令的参数:

    1)path:要查找的目录路径。 

    •       ~ 表示$HOME目录
    •        . 表示当前目录
    •        / 表示根目录 

    2)print:表示将结果输出到标准输出。 

    3)exec:对匹配的文件执行该参数所给出的shell命令。 
          形式为command {} \;,注意{}与\;之间有空格 

    4)ok:与exec作用相同,
          区别在于,在执行命令之前,都会给出提示,让用户确认是否执行 

    5)|xargs  与exec作用相同 ,起承接作用

    区别在于 |xargs 主要用于承接删除操作 ,而 -exec 都可用 如复制、移动、重命名等

    6)options :表示查找方式

    options常用的有下选项:

    -name   filename               #查找名为filename的文件
    -perm                                #按执行权限来查找
    -user    username             #按文件属主来查找
    -group groupname            #按组来查找
    -mtime   -n +n                   #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
    -atime    -n +n                   #按文件访问时间来查找文件,-n指n天以内,+n指n天以前
    -ctime    -n +n                  #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
    -nogroup                          #查无有效属组的文件,即文件的属组在/etc/groups中不存在
    -nouser                            #查无有效属主的文件,即文件的属主在/etc/passwd中不存
    -type    b/d/c/p/l/f             #查是块设备、目录、字符设备、管道、符号链接、普通文件
    -size      n[c]                    #查长度为n块[或n字节]的文件
    -mount                            #查文件时不跨越文件系统mount点
    -follow                            #如果遇到符号链接文件,就跟踪链接所指的文件
    -prune                            #忽略某个目录

    下面通过一些简单的例子来介绍下find的常规用法: 

    1、按名字查找 

          在当前目录及子目录中,查找大写字母开头的txt文件 
           $ find . -name '[A-Z]*.txt' -print   

          在/etc及其子目录中,查找host开头的文件 
          $ find /etc -name 'host*' -print   

          在$HOME目录及其子目录中,查找所有文件   
          $ find ~ -name '*' -print 

          在当前目录及子目录中,查找不是out开头的txt文件   
          $ find . -name "out*" -prune -o -name "*.txt" -print 

    2、按目录查找   

          在当前目录除aa之外的子目录内搜索 txt文件   
          $ find . -path "./aa" -prune -o -name "*.txt" -print   

          在当前目录及除aa和bb之外的子目录中查找txt文件   
          $ find . \( -path './dir0' -o -path './dir1' \) -a -prune -o -name '*.txt' -print

    注意:在1、2处都需要加空格,否则会出现如图所示的报错

               在3处加不加 -a都可以

          在当前目录,不再子目录中,查找txt文件 
          $ find . ! -name "." -type d -prune -o -type f -name "*.txt" -print 

         或者   find . -name *.txt -type f -print


    友情链接:Linux中find命令-path -prune用法详解

    3、按权限查找   
          
          在当前目录及子目录中,查找属主具有读写执行,其他具有读执行权限的文件   
          $ find . -perm 755 -print 

          查找用户有写权限或者组用户有写权限的文件或目录
          find ./ -perm /220
          find ./ -perm /u+w,g+w
          find ./ -perm /u=w,g=w


    4、按类型查找  (b/d/c/p/l/f ) 

          在当前目录及子目录下,查找符号链接文件   
          $ find . -type l -print 

    5、按属主及属组   

          查找属主是www的文件   
          $ find / -user www -type f -print   

          查找属主被删除的文件 
          $ find / -nouser -type f -print   

          查找属组 mysql 的文件 
          $ find / -group mysql -type f -print   

          查找用户组被删掉的文件 
          $ find / -nogroup -type f -print 

    6、按时间查找   

          查找2天内被更改过的文件 
           $ find . -mtime -2 -type f -print   

          查找2天前被更改过的文件 
          $ find . -mtime +2 -type f -print   

          查找一天内被访问的文件 
          $ find . -atime -1 -type f -print   

          查找一天前被访问的文件 
          $ find . -atime +1 -type f -print   

          查找一天内状态被改变的文件 
          $ find . -ctime -1 -type f -print   

          查找一天前状态被改变的文件 
          $ find . -ctime +1 -type f -print   

          查找10分钟以前状态被改变的文件 
          $ find . -cmin +10 -type f -print 

    7、按文件新旧   
          
          查找比 aa.txt 新的文件 
          $ find . -newer "aa.txt" -type f -print   

          查找比 aa.txt 旧的文件 
          $ find . ! -newer "aa.txt" -type f -print   

          查找比aa.txt新,比bb.txt旧的文件 
          $ find . -newer 'aa.txt' ! -newer 'bb.txt' -type f -print 

    8、按大小查找   

          查找超过1M的文件 
          $ find / -size +1M -type f -print   

          查找等于6字节的文件 
          $ find . -size 6c -print   

          查找小于32k的文件 
          $ find . -size -32k -print 

    9、执行命令   
          
          1)查找 del.txt 并删除,删除前提示确认 
          $ find . -name 'del.txt' -ok rm {} \;   

         2) 查找 aa.txt 并备份为aa.txt.bak 
          $ find . -name 'aa.txt' -exec cp {} {}.bak \;

         3)查当前目录下的所有普通文件

        # find . -type f -exec ls -l {} \; 
       -rw-r–r–    1 root      root         34928 2003-02-25   ./conf/httpd.conf 
       -rw-r–r–    1 root      root         12959 2003-02-25   ./conf/magic 
       -rw-r–r–    1 root      root          180 2003-02-25   ./conf.d/README 


       查当前目录下的所有普通文件,并在 - exec 选项中使用 ls -l 命令将它们列出


       4)在 /logs 目录中查找更改时间在5日以前的文件并删除它们
       $ find logs -type f -mtime +5 -exec   -ok   rm {} \;


       5)查询当天修改过的文件
       # find   ./   -mtime   -1   -type f   -exec   ls -l   {} \;


       6)查询文件并询问是否要显示


        # find   ./   -mtime   -1   -type f   -ok   ls -l   {} \;  
        < ls … ./classDB.inc.php > ? y
        -rw-r–r–    1 cnscn    cnscn       13709   1月 12 12:22 ./classDB.inc.php
        # find   ./   -mtime   -1   -type f   -ok   ls -l   {} \;  
        < ls … ./classDB.inc.php > ? n

    关于 有没有 -print 的区别

    加  -print

    查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,没有选项-print时文件列表前一行不会显示目录名称)
    find /home -type d -print -exec ls {} \;

    不加 -print

     

    展开全文
  • 通过前两篇文章,如果我们都掌握了的话,在平常的系统运维、...接下来,我们通过这篇文章,我们将更加深入了解关于find命令的高级应用。接下来我们将分为三个部分分别进行介绍。 四、ACTIONS 这一部分的内容非常...

    通过前两篇文章,如果我们都掌握了的话,在平常的系统运维、管理中基本可以达到得心应手的程度了。接下来,我们通过这篇文章,我们将更加深入了解关于find命令的高级应用。接下来我们将分为三个部分分别进行介绍。

    四、ACTIONS

    这一部分的内容非常多,我就选取常用的部分进行学习、分享。ACTIONS也是表达式中的一部分,表达式中的actions类型参数主要是用来对找到的文件进行操作的参数。在上面的例子中,我们已经看到可以使用-ls参数对找到的文件进行长格式显示,这就是一个actions类型的参数。
    -fls file:跟-ls功能一样,区别是将信息写入file指定的文件,而不是显示在屏幕上。
    -print:将找到的文件显示在屏幕上,实际上默认find命令就会将文件打印出来显示。
    -print0:-print参数会将每个文件用换行分割,而这个参数适用null分割。有时候在脚本编程时可能会用上。
    -fprint file:-print参数的写入文件版本。将内容写到文件中,而不是显示在屏幕上。
    -fprint0 file:-print0的写入文件版本。

    [root@GeekDevOps-find ~]# find / -name root -fprint a.txt
    [root@GeekDevOps-find ~]# vi a.txt 
    /dev/centos/root
    /proc/1/task/1/root
    /proc/1/root
    ...

    上面的命令也相当于:

    [root@GeekDevOps-find ~]# find / -name root -print >a.txt

    -delete:可以将找到的文件直接删除。

    [root@GeekDevOps-find ~]# ll
    总用量 8
    -rw-------. 1 root root 1605 17 18:38 anaconda-ks.cfg
    -rw-r--r--. 1 root root   44 17 23:12 a.sh
    -rw-r--r--. 1 root root    0 124 23:32 a.txt
    -rw-r--r--. 1 root root    0 17 23:11 b.txt
    -rw-r--r--. 1 root root    0 17 23:12 c.txt
    [root@GeekDevOps-find ~]# find / -name a.txt
    /root/a.txt
    [root@GeekDevOps-find ~]# find / -name a.txt -delete
    [root@GeekDevOps-find ~]# ls
    anaconda-ks.cfg  a.sh  b.txt  c.txt

    -printf:格式化输出方式打印,这个就很类似于C语言的printf函数了,在这里可以参考C语言的这个函数,通过man find,我发现,基本就是C语言中printf函数的兄弟。不过写法有点与C语言中不一样,这一点学要我们特别注意一下。

    [root@GeekDevOps-find ~]# find / -name b.txt -printf "%p"
    /root/b.txt[root@GeekDevOps-find ~]#

    -prune:如果复合条件的是一个目录,则不进入目录进行查找。

    [root@GeekDevOps-find ~]# mkdir /etc/shadoww
    [root@GeekDevOps-find ~]# touch /etc/shadoww/shadoww
    [root@GeekDevOps-find ~]# mkdir -p /etc/GeekDevOps/shadoww
    [root@GeekDevOps-find ~]# find / -name shadoww -prune
    /etc/shadoww
    /etc/GeekDevOps/shadoww
    [root@GeekDevOps-find ~]# find / -name shadoww 
    /etc/shadoww
    /etc/shadoww/shadoww
    /etc/GeekDevOps/shadoww

    以上例子中为了避免文件名shadow造成冲突,我在后面多加了一个w,注意区分。
    -quit:找到符合条件的文件后立即退出,子进程同时也结束。
    在find命令中,还可以直接执行一些命令,这个用得好的话也同样能起到事半功倍的效果。
    -exec:find命令的exec是一个非常好用的参数,当然其可能造成的破坏也可能非常大。在使用之前千万要确定自己在做什么。
    这个参数的常见格式是:-exec command ;
    注意后面的分号。它是用来给find做标记用的。find在解析命令的时候,要区分给定的参数是要传给自己的还是要传给command命令的。所以find以分号作为要执行命令所有参数的结束标记。命令返回值为0则返回true。在exec参数指定的执行命令中,可以使用{}符号表示当前find找到的文件名。比如:

    [root@GeekDevOps-find ~]# find /etc/ -name "passwd" -exec echo {} \;
    /etc/passwd
    /etc/pam.d/passwd

    上面的命令表示,找到/etc/目录下文件名为passwd的文件,并echo其文件名。注意再使用分号的时候前面要加转义字符\,因为分号也是bash的特殊字符,所以bash会先解释它。前面加上\就可以让bash直接将其传给find命令,这个分号由find解释,而不是bash。其实这个exec用的比较废话,毕竟find本身就会找到相关条件的文件并显示其文件名。但是试想如果我们将echo换成rm或者cp,是不是就有意义的多?比如:

    [root@GeekDevOps-find ~]# ll
    总用量 8
    -rw-------. 1 root root 1605 17 18:38 anaconda-ks.cfg
    -rw-r--r--. 1 root root   44 17 23:12 a.sh
    -rw-r--r--. 1 root root    0 17 23:11 b.txt
    -rw-r--r--. 1 root root    0 17 23:12 c.txt
    [root@GeekDevOps-find ~]# find / -name "c.txt" -exec rm {} \;
    [root@GeekDevOps-find ~]# ll
    总用量 8
    -rw-------. 1 root root 1605 17 18:38 anaconda-ks.cfg
    -rw-r--r--. 1 root root   44 17 23:12 a.sh
    -rw-r--r--. 1 root root    0 17 23:11 b.txt

    效果是不是非常明显?请不要轻易执行这个命令!!
    或者:

    [root@GeekDevOps-find ~]#  find / -name "b.txt" -exec cp {} {}.bak \;
    [root@GeekDevOps-find ~]# ll
    总用量 8
    -rw-------. 1 root root 1605 1月   7 18:38 anaconda-ks.cfg
    -rw-r--r--. 1 root root   44 1月   7 23:12 a.sh
    -rw-r--r--. 1 root root    0 1月   7 23:11 b.txt
    -rw-r--r--. 1 root root    0 1月  25 00:29 b.txt.bak

    这个命令可以将符合条件的文件都加个.bak后缀备份一份。于是我们可以执行删除了,删除前还是要确认清楚你要删的文件一定是对的。
    -execdir:execdir和exec有一些差别,主要是在执行指定的命令时,exec是在find所指定的起始目录执行,而execdir是包含匹配文件所在的子目录,而不是一个正常目录。

    [root@GeekDevOps-find ~]# find / -name passwd -exec ls {} \;
    index  perms
    /sys/fs/selinux/class/passwd/perms/passwd
    /etc/passwd
    /etc/pam.d/passwd
    /usr/bin/passwd
    [root@GeekDevOps-find ~]# find / -name passwd -execdir ls {} \;
    index  perms
    ./passwd
    ./passwd
    ./passwd
    ./passwd

    前一个命令打印出来的路径都是以/开头,后一个显示的都是当前目录下的某某文件。execdir的方式要比exec安全一些,因为这种执行方式避免了在解析文件名时所产生的竞争条件。
    出了上述两种比较典型的执行命令的方法以外,find还对这两个参数提供了另一种形式的命令执行格式:
    -exec command {} +
    -execdir command {} +
    我们还是先用例子来看一下这个格式和以分号结束的方式的差别:

    [root@GeekDevOps-find ~]# find / -name passwd -exec ls {} +;
    /etc/pam.d/passwd  /etc/passwd  /sys/fs/selinux/class/passwd/perms/passwd  /usr/bin/passwd
    /sys/fs/selinux/class/passwd:
    index  perms
    [root@GeekDevOps-find ~]# find / -name passwd -execdir ls {} +;
    index  perms
    ./passwd
    ./passwd
    ./passwd
    ./passwd

    其实就是说,对于command {} ;格式来说,每找到一个文件就执行一遍相关命令,而command {} +格式的意思是说,先执行find,找到所有符合条件的文件之后,将每个文件作为命令的一个参数传给命令执行,exec指定的命令实际上只被执行了一次。这样用的限制也是不言而喻的:{}只能出现一次。

    [root@GeekDevOps-find ~]# find / -name GeekDevOps.txt -exec cp -t /opt/ {} \+ ;
    cp: 不会以"/home/GeekDevOps/GeekDevOps.txt" 覆盖刚创建的"/opt/GeekDevOps.txt"

    上面这个命令将符合条件的文件全部cp到了/opt/目录中,当然如果文件有重名的情况下,会被覆盖掉。从这个命令中我们学习一下{} +格式的使用注意事项,它不能写成:

    [root@GeekDevOps-find ~]# find / -name GeekDevOps.txt -exec cp {} /opt/ \+;
    find: 遗漏“-exec”的参数

    所以只能使用-t参数改变cp命令的参数顺序来指定相关的动作。

    我们不难看出,直接使用exec和execdir是很危险的,因为他们会直接对找到的文件调用相关命令,并且没有任何确认。所以我们不得不在进行相关操作前再三确认,以防止误操作。当然,find命令也给了更安全的exec参数,它们就是:
    -ok
    -okdir
    它们的作用跟exec和execdir一样,区别只是在做任何操作之前,会让用户确认是不是ok?

    [root@GeekDevOps-find opt]# pwd
    /opt
    [root@GeekDevOps-find opt]# ll
    总用量 0
    [root@GeekDevOps-find opt]# find / -name GeekDevOps.test -ok cp -t /opt/ {} \;
    < cp ... /root/GeekDevOps.test > ? y
    < cp ... /opt/GeekDevOps.test > ? y
    cp: "/opt/GeekDevOps.test""/opt/GeekDevOps.test" 为同一文件
    [root@GeekDevOps-find opt]# ll
    总用量 0
    -rw-r--r--. 1 root root 0 125 11:23 GeekDevOps.test

    通过上面的例子,我们发现GeekDevOps.test这个文件被复制了2次,并且最后一行还有提示,这是由于我们查找和复制都在同一个目录下面,在find命令查找到这个文件时,进行复制,接着进行下一次查找,结果就查找到了之前复制过来的文件,这一点在平时的使用中我们需要注意一下。每一次cp你都要确认是不是要这么做。只要你输入的是y或者以y开头的任何字符串,都是确认。其他的字符串是否认。另外,这两个参数不支持{} +的格式。

    五、操作符(OPERATORS)

    find的操作符(OPERATORS)实际上是用来连接多个表达式和确定其逻辑关系用的。

    [root@GeekDevOps-find opt]# find / -name "Geek*" -type f
    /root/GeekDevOps.txt
    /root/GeekDevOps.doc
    /root/GeekDevOps.docx
    /root/GeekDevOps.wps
    /root/GeekDevOps.txt.bak
    /root/GeekDevOps.test
    /var/spool/mail/GeekDevOps
    /home/GeekDevOps/GeekDevOps.doc
    /home/GeekDevOps/GeekDevOps.txt
    /home/GeekDevOps/GeekDevOps.pdf
    /home/GeekDevOps/GeekDevOps.bpm
    /home/GeekDevOps/GeekDevOps.wps
    /opt/GeekDevOps.test

    这个find命令中使用了两个表达式,他们之间没有任何分隔,这是实际上表达的含义是,找到两个条件都符合的文件。实际上就是表达式的逻辑与关系,这跟-a参数连接或者-and参数一样:

    [root@GeekDevOps-find opt]# find / -name "Geek*" -a -type f

    除了逻辑与关系以外,还有逻辑或关系:

    [root@GeekDevOps-find opt]# find / -name "Geek*" -o -type f

    表示两个条件只要符合其中一个都可以。
    在条件表达式前面加!表示对表达式取非。同样的也可以用-not参数。另外如果表达式很多,可以使用( expr )确定优先级。

    [root@GeekDevOps-find opt]# find / \( -name "passwd" -a -type f \) -o \( -name "shadow" -a -type f \)
    /sys/fs/selinux/class/passwd/perms/passwd
    /etc/passwd
    /etc/shadow
    /etc/pam.d/passwd
    /usr/bin/passwd

    这里表示的是:-name “passwd” -a -type f和-name “shadow” -a -type f是或关系。
    find中还可能常用的其他参数比如:
    -depth:制定了这个参数后,遇到目录先进入目录操作目录中的文件,最后再操作目录本身。
    -maxdepth:目录最大深度限制。
    -mindepth:目录最小深度限制。
    至此,关于find命令的介绍基本完成了,这是一个比较常用的命令,还有更多的功能期待大家去发现,具体可以man一下find的手册。随时随地阅读我的文章,敬请关注同名微信公众号及头条号。

    展开全文
  • Linux: find和xargs用法整理

    千次阅读 2014-11-10 09:44:15
    find命令是一个无处不在命令,是linux中最有用的命令之一。find命令用于:在一个目录(及子目录)中搜索文件,你可以指定一些匹配条件,如按文件名、文件类型、用户甚至是时间戳查找文件。下面就通过实例
  • linux findcp 连用

    千次阅读 2018-10-15 10:40:26
    关于 findcp 连用 提起find 就得说下它的好基友 xargs xargs 是解决有些命令不能用 “|” 传递结果如下题: 把 /bata 目录下,以“.txt” 结尾的普通文件,拷贝到/grk下 看到这个题我们会想到先把 /bata 下...
  • Linux常用命令 --find命令之exec详解

    千次阅读 2019-01-09 11:12:14
    Linux命令--find命令之execexec解释:实例1:ls -l 命令放在 find 命令的 -exec 选项中实例2:在目录中查找更改时间在n 日以前的文件并删除它们实例3:在目录中查找更改时间在n日以前的文件并删除它们,在删除之前...
  • Linux find &amp; cp 查找文件并拷贝到指定位置   find -mtime -1 -type f | xargs cp -t inner/      
  • Linuxfind命令

    千次阅读 2018-11-14 12:35:02
    find命令用来在指定目录下查找文件。格式为“find [查找路径] 寻找条件 操作“ 任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。...
  • Linuxfind命令

    千次阅读 2018-11-13 14:00:20
    find 查找命令  -name 查找某个文件,文件名为name 例如: find /etc/ -name passwd 查找/etc/目录下名为passwd的文件并输出 find /etc -name *.conf 查找/etc/目录下所有以.conf结尾的文件  -user ...
  • linuxfind命令

    万次阅读 2019-03-28 19:33:43
    find /etc/ -name passwd ##查找/etc/下名称中带有passwd的文件 find /etc -maxdepth 1 -name passwd ##查找/etc/下名称中带有passwd的文件,查找一层。 find /etc -name *.conf ##查找/etc/下名称中带有*.conf的...
  • Linux 命令find:查找文件

    万次阅读 2019-04-01 21:36:23
    Linux 命令中,find用于在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名,其支持按名称查找、按正则表达式查找、按文件大小查找、按文件权限查找等多种查询方式。如果在使用该命令时,...
  • Linux系列命令——mv,cp命令详解

    千次阅读 2019-10-24 09:37:08
    (一)mv命令: 1、作用:用来移动文件或者将文件改名 2、格式:mv [选项] 源文件或目录 目标文件或目录 选项: -b 若需覆盖文件,则在覆盖文件前先进行备份 -f 强制覆盖,若目标文件已存在同名文件,使用该...
  • Linux cp 与 mv 命令

    千次阅读 2017-12-25 15:58:27
    noarch是no architecture的缩写,说明这个包可以在各个不同的cpu上使用 包有这么几种(后缀):*....cp = copy || cp -R 使用方法 cp 复制文件 cp -R 复制目录 复制文件或目录 复制目录,用法:CP {源文件} {目标目录
  • Linuxfind命令基本使用方法

    千次阅读 2018-11-14 22:16:14
    Linuxfind命令是系统中查找文件的命令,可以帮助用户快速找出自己所需要的文件。 通过文件名查找 find -name 文件名 find /etc/ -name passwd ###查找/etc目录下的passwd 通过文件嵌套层数查找 find -...
  • linuxfind查找命令用法 Linuxfind命令在目录结构中搜索文件,并执行指定的操作。Linuxfind命令提供了相当多的查找条件,功能很强大。由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得...
  • Linux系统常用基本命令总结

    万次阅读 多人点赞 2020-07-30 19:22:46
    目录 Linux基本命令 Linux的简介 Linux的厂商 Linux的目录结构 基于虚拟机的环境搭建 常用命令与示例 一、文件基本操作命令 ...6. cp命令 7. mv命令 8. rmdir命令 9. rm命令 10. cat命令 11 more和 les...
  • linux find 命令查找文件和文件夹 查找目录:find /(查找范围) -name '查找关键字' -type d 查找文件:find /(查找范围) -name 查找关键字 -print 详解: find命令用来在指定目录下查找文件。任何位于...
  • Linux-find命令

    千次阅读 2016-10-09 23:24:31
    find命令用来在指定目录下查找文件。 任何位于参数之前的字符串都将被视为欲查找的目录名。 如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部...
  • 目的: 想查找webui_jsp工程的下面的的postgres驱动程序文件并复制到一.../xxx/$ find webui_jsp/ -name *post*.jar -exec cp {} /tmp/ \; 如果分开来做的话,可以有下面的步骤 /workspace$ find webui_jsp/ -n
1 2 3 4 5 ... 20
收藏数 72,579
精华内容 29,031
热门标签
关键字:

linux的find跟cp命令