', 'auto'); ga('send', 'pageview'); 明明白白的赛特 – find命令高级用法

find命令高级用法

在 2024-02-03 发布于 工具 分类

对查找结果按照属性排序

find . -printf "%T+ %p\n" | sort
  • -printf "%T+ %p\n": 使用 -printf 选项将找到的文件的修改时间和路径输出到标准输出。

  • %T+: 输出文件的最后修改时间,格式为 "[年-月-日 时:分:秒]"。

  • %p: 输出文件的完整路径。
  • \n: 换行符,用于分隔每个文件的输出。
  • |: 管道操作符,将前一个命令的输出作为后一个命令的输入。
  • sort: 对输出进行排序,按照修改时间从早到晚进行排序。

在一次遍历中执行多个操作

只遍历一次根目录,将找到的小文件写入/tmp/small.txt,将找到的大文件写入/tmp/big.txt

find / \
    \( -size -1k -fprintf /tmp/small.txt '%-10s %p\n' \) , \
    \( -size +100M -fprintf /tmp/big.txt '%-10s %p\n' \)

这里:

  • find /: 从根目录开始搜索。

  • \( -size -1k -fprintf /tmp/small.txt '%-10s %p\n' \): 查找大小小于1k的文件,并将它们的名称和路径输出到 /tmp/small.txt 文件中。

  • -size -1k: 查找大小小于1k的文件。

  • -fprintf: 将匹配的文件名写入指定的文件。
  • /tmp/small.txt: 输出的文件。
  • %-10s %p\n: 格式化输出。其中%s代表文件大小,-10强制文件大小以十个字符宽度显示并且左对齐,%p代表文件路径,\n代表换行。
  • ,: 逻辑“或”操作,表示匹配前面的条件或后面的条件。
  • \( -size +100M -fprintf /tmp/big.txt '%-10s %p\n' \): 查找大小大于100M的文件,并将它们的名称和路径输出到 /tmp/big.txt 文件中。

  • -size +100M: 查找大小大于100M的文件。

  • 其他部分与前面的条件相同。

排除文件和子目录

将当前目录中的文件复制到/dest-dir目录中,但是排除掉名字为'.snapshot'的文件或目录(以及该目录中的所有内容),另外还要排除掉以'~'结尾的文件或目录:

find . -name .snapshot -prune -o \( \! -name '*~' -print0 \) \
    | cpio -pmd0 /dest-dir
  • -name .snapshot -prune: 查找名为 .snapshot 的文件,并使用 -prune 选项排除这些文件。这意味着 find 命令不会处理这些 .snapshot 文件,也不会搜索它们的子目录。
  • -o: 逻辑“或”操作,表示匹配前面的条件或后面的条件。
  • \! -name '*~': 查找不以"~"结尾的文件。这里使用的是否定运算符 \!
  • -print0: 将找到的文件名输出到标准输出,并使用 null 字符作为分隔符。
  • |: 管道操作符,将前一个命令的输出作为后一个命令的输入。
  • cpio -pmd0 /dest-dir: 使用cpio命令将找到的文件复制到 /dest-dir 目录。

-prune -o \( ... -print0 \)结构非常常见。这里的想法是-prune之前的表达式匹配要prune(修剪)的东西。然而,-prune操作本身返回true,因此后面的-o确保右侧只对那些没有被修剪的目录求值(甚至没有访问被修剪的目录下的内容,因此它们的内容是不相关的)。

当要搜索的文件和目录数量庞大的时候,合理应用prune(修剪)能避免一些无意义的查找,因此能提升find命令的执行效率。