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命令的执行效率。