Linux shell 脚本攻略学习笔记2

来源:互联网 发布:手机淘宝优惠券链接 编辑:程序博客网 时间:2024/04/30 06:56

  find是Unix/Linux命令行工具箱中最棒的工具之一。该命令对于编写shell脚本所起到的功用不可小视,今天来讨论一波find的大多数常见用法。

   (1)要列出当前目录及子目录下所有文件和文件夹,可以采用下面的写法

$ find base_path
例如:


 

此外,还有如下命令:

$find . -print
. 指定当前目录,.. 指定父目录。这是Unix文件系统中的约定用法。

- print 指明打印出匹配文件的文件名(路径)。当使用 -print时,'\n'作为用于对输出的文件名进行分割。就算你忽略-print,find命令仍然会打印出文件名。

-print0 指明使用'\0' 作为匹配的文件名之间的定界符。


  (2): 根据文件名或正则表达式进行搜索

来看一条命令:

$ find path  -name  "*.txt" -print
其中 path为指定的路径,参数-name指定了文件名多必须匹配的字符串。我们可以将通配符作为参数使用。 "*.txt"能够匹配所有以.txt结尾的文件。

  例:

    

find 命令还有一个选项 -iname(忽略字母大小写),改选项的作用和-name 类似,只不过在匹配名字时会忽略大小写。

如果想匹配多个条件的一个,可以采用or条件来操作

例:要想打印 scriptes 下 所有的 .txt和.log文件则:



\( 和 \) 用于 将 -name "*.txt"  -o -name "*.log" 视为一个整体。 另外 -path的参数可以使用通配符来匹配文件路径。例如:

$ find /home/users -path "*/slynux/*" -print
上述命令会以下匹配:

    /home/users/list/slynux.txt

    /home/users/slynux/eg.css

 再来看-regex参数,他是基于正则表达式来匹配文件路径的。而 -iregex可以让正则表达式忽略大小写。

例:

aaa文件夹下有以下文件:

   
通过正则表达式匹配.py文件:


若用-iregex,则会匹配到new.PY和test.py:


2:否定参数

find 也可以用 "!" 否定参数的含义。例如

$ find . ! -name "*.txt" -print
上面的find的命令能够匹配所有不以.txt结尾的文件名。下面就是这个命令的运行结果



(3):基于目录深度的搜索

   find命令在使用时有时会遍历所有子目录,我可以采用深度选项 -maxdepth 和 -mindepth来限制find命令遍历的目录深度。

 大多数情况下,我们只需要在当前目录中进行搜索,无序再继续向下查找。对于这种情况,我们使用深度选项来限制find命令向下查找的深度。如果只允许find在当前目录中查找,深度可以设置为; 当需要向下两级时,深度可以设置为2,其他情况一次类推。 例:

$ find . -maxdepth 1 -name "f*" -print
该命令列出当前目录下的文件名以f打头的文件。即使有子目录,也不会被打印或遍历。与之类似,-maxdepth 2 最多向下遍两级子目录。


  (4)根据文件类型进行搜索:

   Unix 类系统将一切都视为文件。文件具有不同的类型,例如普通文件,目录,字符设备,块设备,符号链接,硬链接,套接字以及FIFO等。

  -type 可以对文件搜索进行过滤,借助这个选项,我们可以为find 命令指明特定的文件匹配类型。

  只列出所有的目录:

$ find . -type d print
  列出普通文件:

$ find .  -type f print

 只列出符号链接:

$ find . -type l -print
 

   (5)根据文件时间进行搜索

    Unix/Linux 文件系统中的每一个文件都有三种时间戳,如下所示。

      (a):访问时间(-atime): 用户最近一次访问文件的时间。

      (b): 修改时间(-mtime): 文件内容最后一次被修改的时间。

       (c):变化时间(-ctime): 文件元数据(例如权限或所有权) 最后一次改变的时间。

   -atime , -mtime, -ctime 可以作为find 的时间选项。它们可以用整数值指定,单位是天,这些整数值通常还带有-或+: -表示小于,+表示大于。

  例:

    打印出在最近7天内被访问过的所有文件:

$ find .  -type f -atime -7 -print
    打印出恰好在7天前被访问过的所有文件:

$ find . -type f -atime 7 -print
  打印出访问时间超过7天的所有文件:
$ find . -type f -atime +7 -print

find 另一个漂亮的特性是 -newer参数。 使用-newer,我么可以指定一个用于比较时间戳的参考文件,然后找出比参考文件更新的所有文件。

例:找出比file.txt修改时间更近的所有文件:

$ find . - type f -newer file.txt -print

 (6): 基于文件大小的搜索

根据文件的大小,可以这样搜索

$ find . -type f -size +2k#大于2k的文件

$ find . -type f -size -2k#小于2k的文件

find . -type f -size 2k#大小等于2k的文件

 (7): 删除匹配的文件

  -delete 可以用来删除find查找到的匹配文件

 删除当前目录下所有的.swp文件

$ find . -type f -name "*.swp" -delete
(8):基于文件权限所有权的匹配

也可以根据文件权限进行文件匹配
find . type f -name -perm 644 -print

-perm指明find应该只匹配具有特殊权限值得文件。

 






1 0