[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