一、find命令-exec选项(xargs不是find的选项)
-exec command {} ;
1、正则匹配查找(/etc/目录下搜索以s为文件名开头的文件;)
find /etc/ -type f -name "s*"
注意:如果文件名使用正则匹配,那么需要加双引号,否则会报错;这里只列举了通配匹配方式,其他正则方式如"[ab].sh",“s?”等不再介绍;
2、统计当前目录中以.html结尾的文件总大
方法1:
find . -name "*.html" -exec du -k {} \; |awk '{sum+=$1}END{print sum}'
方法2:
for size in $(ls -l *.html |awk '{print $5}'); do
sum=$(($sum+$size))
done
echo $sum
3、使用-exec选项****(shell命令执行)****
在当前目录下搜索以1为文件名开头的文件,并复制到/root目录下;
find ./ -type f -name "1*" -exec cp {} /root \;
查找当前目录下所有以txt文件中包含123的数字都替换成5678
find ./ -name "*.txt" -exec grep "123" {} \; -exec sed -i 's/123/5678/g' {} \;
注:选项-exec,后面跟要执行的shell命令,{} 花括号代表前面find查找出来的文件名,即把搜索的文件名放到花括号中,注意反斜杠\和分号;之间没有空格,这种用法通常是把搜索的结果做处理;
二、find命令配合xargs
find ./ -type f -name "1*" | xargs -i cp {} /tmp #在当前目录下搜索以1为文件名开头的文件,并复制到/tmp目录下;
find $DEL_DIR -mindepth 1 -type d -mtime +365 | xargs rm -rf
三、exec和xargs二者的区别
1.使用-exec选项,此选项是把参数一个一个传递给shell命令,即传递一个文件名执行一次cp命令;
2.而xargs命令,是把参数一次性传递,即把搜索的所有文件名一次姓传给shell命令处理;
四、常用的按要求查找
语法
find path -option [ -print ] [ -exec -ok command ] {} \;
1、按时间查找(-atime访问时间 -mtime文件内容修改时间 -ctime文件自身属性修改时间)
find /tmp -type f -mtime +7 -name "*.sh" | xargs -i cp {} /data
find /tmp -type f -mtime +7 -name "*.sh" -exec cp {} /data \;
查找/var/log目录中更改时间在7日以前的普通文件,并在删除之前询问它们:
find /var/log -type f -mtime +7 -ok rm {} \;
find /test -type f -newermt 2017-06-03 -a ! -newermt 2017-06-06 按时间范围查找/test下2017-06-03到2017-06-06之间修改过的文件
2、按用户查找
find / -user username 根据属主查找
3、按权限查找
find /tmp -type f -perm -0700 -name '*.sh'
find /var/spool/postfix/public -perm /700 | xargs ls -l
-perm mode 文件的权限正好是mode就匹配
-perm -mode 文件的权限包括mode就匹配(该文件还可以拥有额外的权限属性)
-perm +mode 文件的权限部分满足mode就匹配(已弃用,find新版使用-perm /mode)
4、按大小查找
find /tmp -type f -size +100k -name '*.sh'
5、查找空目录
find /tmp -type d -empty
6、find -print0 和 xargs -0的使用
find . -name "*.txt" -print0 | xargs -0 rm
find . -type f -name "*.php" -print0 | xargs -0 wc -l
xargs命令如果遇到文件名里有空格或者换行符,就会出错。因为xargs识别字符段的标识是空格或者换行符,所以如果一个文件名里有空格或者换行符,xargs就会把它识别成两个字符串,自然就出错了。
这时候就需要-print0和-0了。
find -print0表示在find的每一个结果之后加一个NULL字符,而不是默认加一个换行符。find的默认在每一个结果后加一个’\n’,所以输出结果是一行一行的。当使用了-print0之后,就变成一行了。
然后xargs -0表示xargs用NULL来作为分隔符。这样前后搭配就不会出现空格和换行符的错误了。选择NULL做分隔符,是因为一般编程语言把NULL作为字符串结束的标志,所以文件名不可能以NULL结尾,这样确保万无一失。
https://www.cnblogs.com/chenpingzhao/p/4623799.html xargs详解
https://www.cnblogs.com/liujunjun/p/11977906.html xargs原理及用法详解