设为首页 收藏本站
查看: 905|回复: 0

shell 文件查找命令find

[复制链接]

尚未签到

发表于 2018-8-22 08:45:33 | 显示全部楼层 |阅读模式
文件查找 find
  ------目录------
  1、查找条件
  2、文件查找后的处理
  ----------------
  1、查找条件
  
  1.1)文件名称的匹配 && 多条件名称匹配
  这里可以使用正则表达式来进行匹配,多条件中的AND -a  OR -o来进行拼接
  root@docker-host-03:~# find . \( -name "list*" -o -name "Config*" \)  -print
  ./list
  ./tools/Django-1.7.9/django/views/generic/list.py
  ./tools/Django-1.7.9/django/contrib/comments/templates/comments/list.html
  ./tools/Django-1.7.9/build/lib.linux-x86_64-2.7/django/views/generic/list.py
  ./tools/Django-1.7.9/build/lib.linux-x86_64-2.7/django/contrib/comments/templates/comments/list.html
  ./tools/Django-1.7.9/tests/generic_views/templates/generic_views/list.html
  ./test_shell/module/Config.sh
  ./list2
  正则方式查找文件名称
  . 匹配任意一个
  * 重复之前一任意次
  +重复之前一次或一次以上
  ?前一个字符匹配一个或0个
  root@docker-host-03:~#  find ./tmp –regex   ".*\(\.py\|\.sh\)$"
  ./tmp/.pythontab.py
  ./tmp/install.sh
  ./tmp/testpty.py
  ./tmp/test.py
  ./tmp/test.sh
  利用正则且多条件的名称匹配
  root@docker-host-03:~# find ./tmp   \( ! -regex ".*py.*"  -a -name"*.c" \)
  ./tmp/tcpportping.c
  ./tmp/pid.c
  ./tmp/test.c
  root@docker-host-03:~# find ./tmp     -name "*.c"
  ./tmp/tcpportping.c
  ./tmp/pid.c
  ./tmp/test.c
  ./tmp/test.py.c
  1.2)基于查找路径的搜索
  限定搜索路径的深度
  root@docker-host-03:~# find  ./  -maxdepth 2 -type f -name"*.py"
  ./tmp/.pythontab.py
  ./tmp/testpty.py
  ./tmp/test.py
  1.3)按照搜索的类型来寻找
  -f 文件
  -d 目录
  -l  软连接
  -c  字符设备
  -b  块设备
  1.4)按照搜索的时间来搜索
  -atime : 用户最近一次访问文件的时间
  -mtime : 用户最近一次修改的时间
  -ctime  :文件元数据(例如权限或所有权)最后一次修改的时间
  上面一天为单位
  -cmin  -mmin  -amin  三个以分钟为单位
  root@docker-host-03:~# find  ./ -type f -atime -7  -regex".*\(\.py\|\.sh\)$"
  ./test.sh
  ./test_shell/module/Config.sh
  ./test_shell/module/test1.sh
  ./test_shell/demo1.sh
  ./test_shell/module2/mail.sh
  ./test_shell/main.sh
  ./tmp/test.sh
  1.5)基于搜索的大小来搜索
  root@docker-host-03:~#  find ./ -size +2k  -type f -atime-7  -regex ".*\(\.py\|\.sh\)$"
  root@docker-host-03:~#  find ./ -size -2k  -type f -atime-7  -regex ".*\(\.py\|\.sh\)$"
  ./test.sh
  ./test_shell/module/Config.sh
  ./test_shell/module/test1.sh
  ./test_shell/demo1.sh
  ./test_shell/module2/mail.sh
  ./test_shell/main.sh
  ./tmp/test.sh
  1.6)基于搜索的权限&&所有者来搜索
  root@docker-host-03:~#  find ./ -perm 644 -size -2k  -type f-atime -7  -regex ".*\(\.py\|\.sh\)$"
  ./test_shell/module/Config.sh
  ./test_shell/module2/mail.sh
  root@docker-host-03:~# find  ./ -user root -perm644 -size -2k  -type f -atime -7  -regex ".*\(\.py\|\.sh\)$"
  ./test_shell/module/Config.sh
  ./test_shell/module2/mail.sh
  2、查找后的操作
  两种方式来进行操作的拼接
  2.1)通过-exec { } \; 来进行和其他命令的结合
  如
  root@docker-host-03:~# find ./ -maxdepth 2-type f -name "*.py" -exec ls -lh {}\;
  -rw-r--r-- 1 root root 71 Apr 18  2016 ./tmp/.pythontab.py
  -rw-r--r-- 1 root root 124 Nov 10 16:37./tmp/testpty.py
  -rw-r--r-- 1 root root 1.3K May  3  2016./tmp/test.py
  我们可以这样理解这个命令格式。我们将-exec   \: 当成是使用命令拼接的固定格式,而{}就代表着通过find所查找的文件。
  root@docker-host-03:~# find ./ -maxdepth 2-type f -name "*.py" -exec cat  {} \; >> ./findcont
  root@docker-host-03:~# ls -lh
  total 40K
  lrwxrwxrwx 1 root root   12 Jan  4 11:30 backup -> /data/backup
  -rw-r--r-- 1 root root 2.9K Apr  1 15:17findcont
  但是这里一个弊端就是我们能够接受的命令很有限,如果我们希望将这个文件做多步复杂的处理的话。我们可能需要通过一个函数或者一个脚本传参的形式来完成。
  2.2)通过xargs来实现命令结合
  Xargs 通过管道接受表述输入,并且将此其输入转化为特定名的命令行参数。
  Bash***喜欢单行命令,单行命令是一个命令序列,各命令之间不使用分号,能够更高效处理,对于文本处理也是。Xargs是构建单行命令不可或缺的重要组件。
  我们这样来理解,就是将从标准输入获取的内容,当成参数再次输出给相应的命令。多行的标准输入
  Xargs的预备知识
  -d 执行标准输入的分个数
  -n 对标准输入按照分隔符分割后,输出多少个元素
  -I  指定一个标识符来代替参数。后续如果出现过个标识符,会被替换为具体的参数。
  但在这里需要注意一个误区就是我们当输入的标准输入(也就是|管道的前端)输出的分隔符不确定或者不能明确知道以什么来分割的时候,对于后续要加上的操作就要小心。
  比如下面这个例子,我们有的文件名称中包含空格,我们通过find查找出来,通过 |xargs 之后被分割成了多个参数,如果我们后面结合的命令参数是rm –rf 的话,那么我们会将原本是123123目录下的内容全部删掉。而我们本意是删掉123123 123123.asdf文件。
  root@docker-host-03:~# find ./ -maxdepth1  -name "123*" | xargs  -n 1
  ./123123
  123123.asdf
  ./123123
  root@docker-host-03:~# ls -lh
  total 44K
  drwxr-xr-x 2 root root 4.0K Apr  1 16:19123123
  -rw-r--r-- 1 root root    0 Apr  1 16:18 123123 123123.asdf
  如何避免这个问题,我们需要在xargs 加上-0(数字) 来限定以\0为界定符
  root@docker-host-03:~# find ./ -maxdepth 1-name "123*"    |xargs -0
  ./123123 123123.asdf
  ./123123
  root@docker-host-03:~# find ./ -maxdepth 1-name "123*"    |xargs
  ./123123 123123.asdf ./123123
  Xargs和find 的结合
  Xargs和find的结合就是通过find 查找到相应文件,通过|管道输出给xargs,然后xargs 将输入的文件进行分割,然后通过-I 指定一个参数替代标识符。比如和-exec 的{}一样,那我们的命令格式就会变成是一下这样的。
  root@docker-host-03:~# find ./ -maxdepth 1-type f -name "*.sh" | xargs -I {} ls -lh {}
  -rwxr-xr-x 1 root root 13 Apr  1 15:22 ./test.sh
  -rw-r--r-- 1 root root 0 Apr  1 16:38 ./123.sh
  #这里讲标识设置为1,后面就是用1来代表。这里有部分符号是不能作为标识符的。
  root@docker-host-03:~# find ./ -maxdepth 1-type f -name "*.sh" | xargs -I 1 ls -lh  1
  -rwxr-xr-x 1 root root 13 Apr  1 15:22 ./test.sh
  -rw-r--r-- 1 root root 0 Apr  1 16:38 ./123.sh


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-554909-1-1.html 上篇帖子: shell if 详解 下篇帖子: 几种常见的Shell
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表