Linux 下 find 命令的学习笔记

前言

感觉很多时候使用find命令会省很多事,但是苦于一直不太会,每次都是被重复的事情累的焦头烂额才想起来还有个叫做 find 的工具。。。
这两天遇到了需要批量给文件改名字并修改权限的需求,无奈文件非常分散,目录层数也很多,总共少说有200-300个文件,自己纯手工 cd 了好多次,实在受不了这种单调的操作了,于是去网上搜有没有快捷命令。于是让咱认识到 find 这种平时可能只能用到一两次的功能,不好好学一下是不行的了。。。。所以就有了本文。

基础用法

按照其他命令的使用习惯,咱一直认为 find 命令也是 $ find 文件名或者
$ find 目录 文件名就可以了,结果每次都是被输出了一屏幕的无关路径再被返回一个无法找到“文件名”
网上查了一下之后依稀记得用法是在文件名前面多加一个 name 。。。可由于其他命令的使用习惯,每次输入的时候都是$ find --name 文件名。。。经过多次的被错误糊脸之后,终于记住了 find 的正确用法 $ find 目录 -name 文件名 [其他参数]

快速区分文件和目录

使用 find 命令可以筛选文件和目录,假设现在的目录如下所示:
[email protected]:~/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 来进行筛选。

输出
[email protected]:~/test# find -name "*.txt"
./4.txt
./dir.txt
./5.txt
./3.txt
./123.txt
./1.txt
./2.txt
[email protected]:~/test# find -name "*.txt" -type f
./4.txt
./5.txt
./3.txt
./123.txt
./1.txt
./2.txt
[email protected]:~/test# find -name "*.txt" -type d
./dir.txt
[email protected]:~/test#

根据 find 的使用手册中的描述,可以使用 -type 来筛选出常见的UNIX文件类型
b 块设备,c 字符设备,d 目录,p 管道,f 普通文件,l 符号链接,s socket,
D door (Solaris),筛选一种以上的文件类型可以使用英文逗号 "," 链接

让命令更方便

回到一开始咱遇到的问题上,将所有文件权限设置为644,全部目录设置为755,即便可以把文件和目录区分开,也依然免不了弄一个chmod脚本之类的东西出来,说到底没省事太多,于是又去google上好好找了一下,发现 find 命令本身就支持把找到的对象的路径作为参数运行其他命令,选项是 -exec 命令 \; 或者 -exec 命令 \+经过咱好好的研究,这两种方法传给命令的参数的样子不一样,另外还可以使用{}代替找到的对象的路径。具体可以查看下面的实例:

实例
[email protected]:~/test# find . -type f -exec echo "{}" > 123 \;
[email protected]:~/test# cat 123
./4.txt
./5.txt
./3.txt
./123
./123.txt
./1.txt
./2.txt
[email protected]:~/test# find . -type f -exec echo "{}" > 123 \+
[email protected]:~/test# cat 123
./4.txt ./5.txt ./3.txt ./123 ./123.txt ./1.txt ./2.txt

换句话说就是,一个会把每一个找到的对象单独丢给指定的命令执行一次,另一个会把所有对象打包丢给指定的命令。。。

于是原本需要一行一行复制粘贴的chmod脚本就变成了一行命令
find . -type f -exec chmod 644 "{}" \; 目录操作也是同理
find . -type d -exec chmod 755 "{}" \; 问题解决,撒花~❀

至于其他用法。。。咱也不太清楚,不过大概今后用到了的话会再更新进来的吧quq

点赞
  1. repostone说道:
    Google Chrome Windows 8.1

    非技术的路过。

发表评论

电子邮件地址不会被公开。必填项已用 * 标注