zoukankan      html  css  js  c++  java
  • linux分享三:文件操作

    查找文件命令:

    which       查看可执行文件的位置 
    whereis    查看文件的位置 
    locate       配 合数据库查看文件位置 
    find          实际搜寻硬盘查询文件名称

    一:find

    ?表示  通配任意的单个字符

    *表示  通配任意的字符

    1:查找指定的文件并删除

    1> rm -f `find . -name "*.log"`

    2> find . -name "*.log" | xargs rm -f

    3> find . -name "*.log" -exec rm -f {} ;

        注意:在{}和之间必须要有空格,否则会报 find: missing argument to `-exec'

        (xargs -0 参数防止文件名中有空格导致被 rm 认作是两个不同的文件。

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

        find . -name "*.log" -exec cp {} {}.bak ;  复制文件

    4> find . -type f -name "*.txt" -delete

    备注:

    find ~ -name "[0-9]*.pid" -print   #查找以数字开头的所有pid文件,在这里要说[0-9]*不能匹配23,它跟一般的语言类正则不太一样,shell里面的*可以代表一切字符(单个,多个都行)
    如果想匹配2345只能这样写[0-9][0-9][0-9][0-9]

     2:多目录、多条件搜索

    -a 连接两个不同的条件(两个条件必须同时满足)

    -o 连接两个不同的条件(两个条件满足其一即可)

     -not 对条件取反的

    1> find mediatek/ frameworks/ system/ external/  -iname "*sqlite*.c"

    2> 多文件搜索+多目录搜索

    find mediatek/ frameworks/ system/ external/  -iname "*sqlite*.c" -o -iname "*sqlite*.cpp" -o -iname "*sqlite*.java"

    3:查找条件

    -type:

    f     // 普通文件

    d     //目录文件

    l     //链接文件

    b     //块设备文件

    c     //字符设备文件

     p     //管道文件

     s     //socket文件

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

    -nouser  and  -nogroup

    在整个系统中查找既没有属主又没有属组的文件(这样的文件通常是很危险的,作为系统工程师的我们应该及时清除掉)

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

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

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

    另外,下面三个的区别:

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

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

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

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

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

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

    例子:

    find . -type d | sort  查找当前所有目录并排序

    find . -size +1000c -print  查找当前目录大于1K的文件   +大于 -小于 没有前缀为等于

    find . -name "*.log" -mtime +5 -ok rm {} ;   在目录中查找更改时间在n日以前的文件并删除它们,在删除之前先给出提示

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

    find . -name "*.log" -exec mv {} .. ;   查找文件移动到指定目录

    find . -perm -7 -print | xargs chmod o-w    在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限

    find . -size +1000000c -print  在当前目录下查找文件长度大于1 M字节的文件 

    find . -size +10 -print  在当前目录下查找长度超过10块的文件(一块等于512字节)

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

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

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

    常见错误原因:

    1> 为什么不能直接用ls输出find查找的结果,而要用exec或 搭配 xargs才能输出结果?

    find / -perm +7000 | ls -l 

    答:ls的参数从argv获取,管道给ls的是STDIN_FILENO

    int main(int argc, char *argv[])
    注意区分命令行参数(术语不一定标准)和标准输入。
    ls期待的是命令行参数,即main()的`argv`;
    而管道传给ls的是标准输入,和`argv`没有关系。
    http://www.zhihu.com/question/36827128?sort=created

    二:statstat -f <file>: 显示<file>所在文件系统的状态信息。

    stat <file>: 显示指定文件<file>的状态信息。

    三:file

    查看文件类型

    四:which

    which是通过 PATH环境变量到该路径内查找可执行文件,所以基本的功能是寻找可执行文件

    五:whereis

     whereis [-bmsu] 文件或者目录名称 
    参数说 明: 
    -b : 只找二进制文件 
    -m: 只找在说明文件manual路径下的文件 
    -s : 只找source源文件 
    -u : 没有说明文档的文件 
    例如:

    whereis passwd  

    passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

    whereis -b passwd

    passwd: /usr/bin/passwd /etc/passwd

    和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通 过遍历硬盘来查找,效率自然会很高。 
    但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。

    六:locate
    locate 文件或者目录名称

    即先运行:updatedb(无论在那个目录中均可,可以放在crontab中 )后在   /var/lib/mlocate/ 下生成 mlocate.db 数据库即可快速查找。在命令提示符下直接执行#updatedb 命令即可:

    常用语句:

    获取匹配某个字段的整行:

    cat /opt/data/chrome/*/*/2016-03-02/00/guess2016-03-02_00_00.txt | awk '$5 ~ "^http://www.2345.com"' | grep "2016-03-02 00:00:00"

  • 相关阅读:
    多线程常见面试题
    Redis常见面试题总结
    ehcache缓存技术的特性
    sar 命令详解
    面试题
    BOOTPROTO=[none|static|bootp|dhcp](引导时不使用协议|静态分配|BOOTP协议|DHCP协议)
    课后习题-10
    ulimit 命令详解
    课后习题-9
    netstat 命令详解
  • 原文地址:https://www.cnblogs.com/Alight/p/5217506.html
Copyright © 2011-2022 走看看