共计 2640 个字符,预计需要花费 7 分钟才能阅读完成。
01 一起来意识 find!
在 Linux 零碎,find 毫无疑问是最强的文件查找工具。find 个别会与其余命令联合,将查找到的后果作为参数传入到后置命令中,进行删除、统计、复制迁徙等操作。
02 find 文件名、类型查找过滤
- find / -name ‘hello.txt’ #从根目录下开始查找文件 hello.txt;
- find . -iname ‘hello.txt’ #从当前目录下开始查找文件 hello.txt,-iname 会疏忽大小写;
- find . -name ‘*hello.txt’ #当前目录下,查找指标名称后缀为 “hello.txt” 的文件;
- find / -type f -size +500M #从根目录开始查找,500M 以上文件;-type f: f 为一般文件类型,f 改为 d 则是目录文件,l 则是符号链接文件,-type 还有其余参数;-size +500M:500MB 以上。个别磁盘空间不够,删除垃圾文件时会应用到此命令;
- find . -type f -size +1k #查找以后文件夹下超过 1k 的文件,留神 k 是小写;
- find /etc ! -type f #查找 /etc 目录下不是一般文件的文件,”!”: 感叹号,取反;
03 find 工夫范畴查找过滤
find . {-atime/-ctime/-mtime/-amin/-cmin/-mmin} [-/+]num #应用根本格局
- 第一个参数,’.’ 代表当前目录,如果是其余目录,能够输出相对目录和绝对目录地位;
- 第二个参数分两局部,后面字母 a、c、m 别离代表拜访、变更、批改,前面 time 为日期,min 为分钟,留神只能以这两个作为单位;
- 第三个参数为量,其中不带符号示意合乎该数量的,带 - 示意合乎该数量当前的,带 + 示意合乎该数量以前的。
👇参数阐明:
- atime:拜访工夫(access time),指的是文件最初被读取的工夫,能够应用 touch 命令更改为以后工夫;
- ctime:变更工夫(change time),指的是文件自身最初被变更的工夫,变更动作能够使 chmod、chgrp、mv 等等;
- mtime:批改工夫(modify time),指的是文件内容最初被批改的工夫,批改动作能够使 echo 重定向、vi 等等;
👇一些应用示例:
- find . -type f -mtime -30 #查找当前目录下 30 天之内批改过的文件;
- find /var/log/ -mtime +30 -name ‘*.log’ # 查找指定目录 /var/log/ 下 30 天以前被批改的 log 类型文件;
- find /etc -maxdepth 1 ! -type l -mtime -30 #查找 /etc 第一层目录下不是符号链接文件的文件,并在 30 天内被批改过,-maxdepth : 指定目录层级,-maxdepth 1 代表第 1 层,-maxdepth 2 代表延长到第二层;
04 find 组合命令删除文件的三种办法
【场景案例】
用 wc - l 来统计下 log 数量,再进行删除。
find . -name ‘*.log’ -mtime +30 | wc -l #从当前目录下开始搜寻 30 天之前的 log 文件,并统计数量,“|”: 管道符,将后面查到的数据作为输出源给前面的命令;
【第一种删除形式:-exec】
find . -name ‘*.log’ -mtime +30 -exec rm {} \; #查找当前目录下 30 天以前的 log 文件,应用 -exec 加 rm 将其删除;exec 命令以分号完结 ’;’,该分号后面要放反斜杠本义。
【第二种删除形式:-ok】
find . -name ‘*.log’ -mtime +30 -ok rm {} \; #查找当前目录下 30 天以前的 log 文件,-ok : 询问删除,y 删除,n 不删除,回车默认不删除;命令以分号完结 ’;’,该分号后面要放反斜杠本义。
【第三种删除形式:xargs】
find . -name ‘*.log’ -mtime +30 -print0 | xargs -0 rm -f # xargs : 命令传递参数过滤器,与管道符 “|” 一起应用,将后面的命令传递给前面的命令应用;
05 find 与 xargs 组合应用
- xargs 辨认字符段的标识是空格或者换行符,若一个文件名里有空格或者换行符,xargs 就会把它辨认成两个字符串,就会出错。这时就须要 -print0 和 -0。
- find -print0 示意在 find 的每一个后果之后加一个 NULL 字符,而不是默认加一个换行符。find 的默认在每一个后果后加一个 ‘\n’,所以输入后果是一行一行的。当应用了 -print0 之后,就变成一行了。
- xargs -0 示意 xargs 用 NULL 来作为分隔符。这样前后搭配就不会呈现空格和换行符的谬误。NULL 做分隔符,是因为个别编程语言把 NULL 作为字符串完结的标记,所以文件名不可能以 NULL 结尾。
👇应用案例:
- find . -name ‘*.log’ -mtime +10 -print0 | xargs -0 rm -f #保险的形式删除,举荐这样应用
- find / -name ‘*.log’ -mtime +30 | xargs ls -l #对于 30 天前的 log 文件进行详情查看,利用 xargs + ls -l 命令来进行文件的具体属性查看;
- find / -name ‘*.log’ -mtime +30 | xargs -i mv {} /logback #将 30 天前的所有 log 文件挪动到 /logback 文件夹下,xargs -i + {},将后面查找到的文件都作为参数给 mv 命令执行;
06 find 下 xargs 与 -exec 的区别
👇区别一:
- -exec,是将查找到的后果文件名一一传递给前面的命令执行,文件多会导致效率低;
- xargs,则是一次性传递,效率较高,并可应用 - n 参数管制传递文件个数。
👇区别二:
- -exec,文件名有空格等特殊字符也照常解决;
- xargs,解决非凡的文件名(例如文件名有空格)须要采纳非凡的解决形式(find . -name “*.log” -print0| xargs -0 ls -l)。
07 一个罕用实际组合命令
【场景】
查找超过 500M 大小文件,并显示查找进去文件的具体大小,且依照大小排序。
【命令示例】
- find . -type f -size +500M -print0 | xargs -0 du -h | sort -nr
- find . -name ‘*.log’ -size +500M -print0 | xargs -0 du -h | sort -nr
08 小结
find 命令是查找文件神器,可按文件名、类型查找过滤;按工夫范畴查找过滤;同时组合其余命令应用,可大大提高操作效率。
「不甩锅的码农」原创,转载请注明起源,未经受权禁止商业用途!同名 GZH 请关注!
正文完