zoukankan      html  css  js  c++  java
  • find、xargs、grep

    find

    find命令用于:在一个目录(及子目录)中搜索文件,你可以指定一些匹配条件,如按文件名、文件类型、用户甚至是时间戳查找文件。

    find命令一般简化形式(还可以更复杂,更多操作) find [path...] [expression]

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

    touch一些测试文件

    $ ls
    hello.cpp  kg.lua  kobebryant  Kobe.lua

    参考:http://tiger-hu.iteye.com/blog/1927754

    按名字查找

    -name 和 -iname的区别在于前者对大小写敏感,后者不敏感

    $ find . -name "k*"
    ./kobebryant
    ./kg.lua

    $ find . -iname "k*"
    ./kobebryant
    ./Kobe.lua
    ./kg.lua

    按时间查找

     -atime  -n[+n]: 找出文件访问时间在n日之内[之外]的文件。
        -ctime  -n[+n]: 找出文件更改时间在n日之内[之外]的文件。
        -mtime -n[+n]: 找出修改数据时间在n日之内[之外]的文件。
        -amin   -n[+n]: 找出文件访问时间在n分钟之内[之外]的文件。
        -cmin   -n[+n]: 找出文件更改时间在n分钟之内[之外]的文件。
        -mmin  -n[+n]: 找出修改数据时间在n分钟之内[之外]的文件。

    比如:找出一天内修改文件

    $ find -ctime -1
    .
    ./hello.cpp
    ./kobebryant
    ./Kobe.lua
    ./kg.lua

    基于找到的文件执行操作

     -exec: 对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} ;,注意{}和;之间的空格,同时两个{}之间没有空格。特别注意:分号是必须打,作为-exec的结束符
     -ok:  其主要功能和语法格式与-exec完全相同,唯一的差别是在于该选项更加安全,因为它会在每次执行shell命令之前均予以提示,只有在回答为y的时候, 其后的shell命令才会被继续执行。需要说明的是,该选项不适用于自动化脚本,因为该提供可能会挂起整个自动化流程。

    比如:找出60分钟内修改的文件,并执行ls -l ,也就是显示出详情

    $ find . -cmin -60 -exec ls -l {} ;
    总用量 0
    -rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:29 hello.cpp
    -rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 kg.lua
    -rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 kobebryant
    -rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 Kobe.lua
    -rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:29 ./hello.cpp
    -rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 ./kobebryant
    -rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 ./Kobe.lua
    -rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 ./kg.lua

    比如:找出kg为首的文件,提示删除

    $ find . -name "kg*" -ok rm {} ;
    < rm ... ./kg.lua > ? y
    $ ls
    hello.cpp  kobebryant  Kobe.lua

    按文件所属的owner和group查找:
        -user:      查找owner属于-user选项后面指定用户的文件。
        ! -user:    查找owner不属于-user选项后面指定用户的文件。
        -group:   
    查找group属于-group选项后面指定组的文件。
        ! -group: 查找group不属于-group选项后面指定组的文件。

    比如

    $ find . -user philosophie
    .
    ./hello.cpp
    ./kobebryant
    ./Kobe.lua

    按指定目录深度查找

    -maxdepth: 后面的参数表示距当前目录指定的深度,其中1表示当前目录,2表示一级子目录,以此类推。在指定该选项后,find只是在找到指定深度后就不在递归其子目录了。下例中的深度为1,表示只是在当前子目录中搜索。如果没有设置该选项,find将递归当前目录下的所有子目录。

    $ mkdir hhh

    $ cd hhh/

    $ touch h.c

    $ find . -maxdepth 1 -name "*"    # 当前目录找不到 h.c
    .
    ./hello.cpp
    ./kobebryant
    ./hhh
    ./Kobe.lua


    $ find . -maxdepth 2 -name "*"  # 1级子目录找到了h.c
    .
    ./hello.cpp
    ./kobebryant
    ./hhh
    ./hhh/h.c
    ./Kobe.lua

    按文件权限属性查找

    补充:文件权限,分别为 所有者、所在组、其他组,八进制数字

    $ ll
    总用量 12
    drwxrwxr-x 3 philosophie philosophie 4096 8月   5 23:56 ./
    drwxrwxr-x 3 philosophie philosophie 4096 8月   5 22:26 ../
    -rw-rw-r-- 1 philosophie philosophie    0 8月   5 22:29 hello.cpp
    drwxrwxr-x 2 philosophie philosophie 4096 8月   5 23:57 hhh/
    -rw-rw-r-- 1 philosophie philosophie    0 8月   5 22:27 kobebryant
    -rw-rw-r-- 1 philosophie philosophie    0 8月   5 22:27 Kobe.lua

    $ find . -perm 664
    ./hello.cpp
    ./kobebryant
    ./hhh/h.c
    ./Kobe.lua

    $ find . -perm 775
    .
    ./hhh

    按文件类型查找

     -type:后面指定文件的类型。
        b - 块设备文件。
        d - 目录。
        c - 字符设备文件。
        p - 管道文件。
        l  - 符号链接文件。
        f  - 普通文件。

    $ mkdir kkk

    $ find . -type d
    .
    ./kkk
    ./hhh
    $ find . -type d -name "h*"
    ./hhh

    按文件大小查找

    -size [+/-]100[c/k/M/G]: 表示文件的长度为等于[大于/小于]100块[字节/k/M/G]的文件。
     -empty: 查找空文件。

    比如,查找文件大小为0的文件可以这样写

    -size [+/-]100[c/k/M/G]: 表示文件的长度为等于[大于/小于]100块[字节/k/M/G]的文件。
        -empty: 查找空文件。

    比如

    $ find . -size 0 -exec ls -l {} ;
    -rw-rw-r-- 1 philosophie philosophie 0 8月 6 10:30 ./b
    -rw-rw-r-- 1 philosophie philosophie 0 8月 6 10:30 ./a

    也可以

    $ find . -empty -exec ls -l {} ;
    -rw-rw-r-- 1 philosophie philosophie 0 8月 6 10:30 ./b
    -rw-rw-r-- 1 philosophie philosophie 0 8月 6 10:30 ./a

    按更改时间比指定文件新或比文件旧的方式查找

    -newer file

    比如,查找比b更新的文件,也就是更晚创建的文件

    $ find . -newer b

    查找不比b更新的文件,输出会包括文件b

    $ find . ! -newer b

    xargs

    背景:在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。

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

    在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高; 而使用xargs命令则只有一个进程。

     

    比如:找到所有普通文件,并测试每个文件是什么类型的

    $ find . -type f -print|xargs file
    ./b: empty
    ./c: empty
    ./a: empty
    ./t.sh: a /bin/bsah script, ASCII text executable
    ./hello.lua: ASCII text

    grep 

    参考:http://blog.csdn.net/zhushuai1221/article/details/53097008

    grep (global search regular expression(RE) and print out the line 全局搜索正则表达式并把行打印出来。

    作用:它能使用正则表达式搜索文本,并把匹配的行打印出来。

    Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词。

    Linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

    常用的grep选项有:

    -c   只输出匹配行的计数。
    -i   不区分大小写。
    -h   查询多文件时不显示文件名。
    -l   查询多文件时只输出包含匹配字符的文件名。
    -n   显示匹配行及行号。
    -s   不显示不存在或无匹配文本的错误信息。
    -v   显示不包含匹配文本的所有行。

    比如:

    将utils.lua出现local的行取出来

    $ grep local utils.lua
    local TableDB = require('.TableDB')
    local M = {}

    显示出来的同时显示行号

    $ grep -n local utils.lua
    2:local TableDB = require('.TableDB')
    3:local M = {}

    我这里显示出的local是标记了红色的,原本应该不是默认这样的,要使得查找的关键字的显示颜色应该要这样写

    grep -n --color=auto 'local'

    但是之所以默认这样是因为~/.bashrc这个文件配置过了,如下

    将匹配的行的前2行后3行也打印出来,就拿bashrc这个文件为例,找出配置了grep的地方。(后面的grep不用引号也是可以的)

    $ cat ~/.bashrc | grep -n -A3 -B2 'grep'
    80- #alias vdir='vdir --color=auto'
    81-
    82: alias grep='grep --color=auto'
    83: alias fgrep='fgrep --color=auto'
    84: alias egrep='egrep --color=auto'
    85-fi
    86-
    87-# colored GCC warnings and errors

    按文件的内容查找文件

    # grep ‘energywise’ *           #在当前目录搜索带'energywise'行的文件  

    # grep -r ‘energywise’ *        #在当前目录及其子目录下搜索'energywise'行的文件  

    # grep -l -r ‘energywise’ *     #在当前目录及其子目录下搜索'energywise'行的文件  

     

    正则表达式

    以后再弄

  • 相关阅读:
    微信小程序 添加卡券至微信卡券
    微信小程序 引入第三方字体
    小程序 生成条形码barcode.js
    Pycharm编辑器功能之自动导入模块
    Cannot open include file: 'libxml/xpath.h': No such file or directory
    怎么在32位windows系统上搭建爬虫框架scrapy?
    python2.7安装Twisted报Microsoft Visual C++9.0 required
    在windows下搭建爬虫框架,安装pywin32时出错?
    python如何通过pymongo连接到mongodb?
    python2.7.12自带pip吗?
  • 原文地址:https://www.cnblogs.com/i-love-kobe/p/7281296.html
Copyright © 2011-2022 走看看