[infobox title="前言"]感觉很多时候使用find命令会省很多事,但是苦于一直不太会,每次都是被重复的事情累的焦头烂额才想起来还有个叫做 find 的工具。。。
              这两天遇到了需要批量给文件改名字并修改权限的需求,无奈文件非常分散,目录层数也很多,总共少说有200-300个文件,自己纯手工 cd
              了好多次,实在受不了这种单调的操作了,于是去网上搜有没有快捷命令。于是让咱认识到 find 这种平时可能只能用到一两次的功能,不好好学一下是不行的了。。。。所以就有了本文。
              [/infobox]
              [infobox title="基础用法"]
              按照其他命令的使用习惯,咱一直认为 find 命令也是 $ find 文件名或者
              $ find 目录 文件名就可以了,结果每次都是被输出了一屏幕的无关路径再被返回一个无法找到“文件名”
              网上查了一下之后依稀记得用法是在文件名前面多加一个 name
              。。。可由于其他命令的使用习惯,每次输入的时候都是$ find --name 文件名。。。经过多次的被错误糊脸之后,终于记住了 find 的正确用法 $ find 目录 -name 文件名 [其他参数]
              [/infobox]
              [infobox title="快速区分文件和目录"]
              使用 find 命令可以筛选文件和目录,假设现在的目录如下所示:
              root@safufu:~/test# ll
              total 8
              -rw-r--r-- 1 root root    0 Jul 27 06:32 1.txt
              -rw-r--r-- 1 root root   56 Jul 27 06:36 123
              -rw-r--r-- 1 root root    0 Jul 27 06:34 123.txt
              -rw-r--r-- 1 root root    0 Jul 27 06:33 2.txt
              -rw-r--r-- 1 root root    0 Jul 27 06:33 3.txt
              -rw-r--r-- 1 root root    0 Jul 27 06:33 4.txt
              -rw-r--r-- 1 root root    0 Jul 27 06:33 5.txt
              drwxr-xr-x 2 root root 4096 Jul 27 06:54 dir.txt
              则可以使用 -type 选项进行筛选
              如使用 find -name ".txt"找出来所有的文本文件,却不想要作为目录的
              dir.txt则可以使用find -name ".txt" -type f 来进行筛选
              同理,只想找到目录则可以使用 find -name ".txt" -type d 来进行筛选。
              [collapse title="输出"]
              root@safufu:~/test# find -name ".txt"
              ./4.txt
              ./dir.txt
              ./5.txt
              ./3.txt
              ./123.txt
              ./1.txt
              ./2.txt
              root@safufu:~/test# find -name ".txt" -type f
              ./4.txt
              ./5.txt
              ./3.txt
              ./123.txt
              ./1.txt
              ./2.txt
              root@safufu:~/test# find -name ".txt" -type d
              ./dir.txt
              root@safufu:~/test#[/collapse]
              根据 find 的使用手册中的描述,可以使用 -type 来筛选出常见的UNIX文件类型
              b 块设备,c 字符设备,d 目录,p 管道,f 普通文件,l 符号链接,s socket,
              D door (Solaris),筛选一种以上的文件类型可以使用英文逗号 "," 链接
              [/infobox]
            
[infobox title="让命令更方便"]
回到一开始咱遇到的问题上,将所有文件权限设置为644,全部目录设置为755,即便可以把文件和目录区分开,也依然免不了弄一个chmod脚本之类的东西出来,说到底没省事太多,于是又去google上好好找了一下,发现
              find 命令本身就支持把找到的对象的路径作为参数运行其他命令,选项是 -exec 命令 ; 或者
              -exec 命令 +经过咱好好的研究,这两种方法传给命令的参数的样子不一样,另外还可以使用{}代替找到的对象的路径。具体可以查看下面的实例:
              [collapse
              title="实例"]root@safufu:~/test# find . -type f -exec echo "{}" > 123 ;
              root@safufu:~/test# cat 123
              ./4.txt
              ./5.txt
              ./3.txt
              ./123
              ./123.txt
              ./1.txt
              ./2.txt
              root@safufu:~/test# find . -type f -exec echo "{}" > 123 +
              root@safufu:~/test# cat 123
              ./4.txt ./5.txt ./3.txt ./123 ./123.txt ./1.txt ./2.txt[/collapse]
              换句话说就是,一个会把每一个找到的对象单独丢给指定的命令执行一次,另一个会把所有对象打包丢给指定的命令。。。
            
于是原本需要一行一行复制粘贴的chmod脚本就变成了一行命令
              find . -type f -exec chmod 644 "{}" ; 目录操作也是同理
              find . -type d -exec chmod 755 "{}" ; 问题解决,撒花~❀
            
[/infobox]
至于其他用法。。。咱也不太清楚,不过大概今后用到了的话会再更新进来的吧quq
 
        