乐趣区

关于后端:008-Linux-文件查找-find

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 #应用根本格局

  1. 第一个参数,’.’ 代表当前目录,如果是其余目录,能够输出相对目录和绝对目录地位;
  2. 第二个参数分两局部,后面字母 a、c、m 别离代表拜访、变更、批改,前面 time 为日期,min 为分钟,留神只能以这两个作为单位;
  3. 第三个参数为量,其中不带符号示意合乎该数量的,带 - 示意合乎该数量当前的,带 + 示意合乎该数量以前的。

👇参数阐明:

  • 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 组合应用

  1. xargs 辨认字符段的标识是空格或者换行符,若一个文件名里有空格或者换行符,xargs 就会把它辨认成两个字符串,就会出错。这时就须要 -print0 和 -0。
  2. find -print0 示意在 find 的每一个后果之后加一个 NULL 字符,而不是默认加一个换行符。find 的默认在每一个后果后加一个 ‘\n’,所以输入后果是一行一行的。当应用了 -print0 之后,就变成一行了。
  3. 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 请关注!

退出移动版