find命令结果中重复显示同一文件的原因及解决方法
问题
执行命令 find . -atime -1 -exec ls -lt {} \; 后,结果中出现同一文件同时以hello.txt和./hello.txt形式重复显示的情况,请问该现象产生的原因是什么?如何避免?
原因
这种重复是find的遍历逻辑和-exec的执行方式共同导致的:
find .会遍历当前目录下的所有条目,包括当前目录本身(.)和目录下的文件(比如./hello.txt);- 当当前目录满足
-atime -1的匹配条件时,find会执行ls -lt .,这条命令会列出当前目录下的所有文件,其中就包含hello.txt; - 随后
find遍历到./hello.txt时,又会单独执行ls -lt ./hello.txt,再次输出该文件的信息,最终导致同一文件被重复显示。
解决方法
有几种简洁的方式可以避免这种重复:
- 仅查找普通文件,排除目录:在
find命令中添加-type f参数,让find只匹配普通文件,不会将当前目录(目录类型)纳入匹配范围。修改后的命令为:find . -type f -atime -1 -exec ls -lt {} \; - 改用
xargs批量处理:用-print0和xargs -0组合批量传递匹配的文件路径,避免多次调用ls,同时可搭配-type f排除目录:find . -type f -atime -1 -print0 | xargs -0 ls -lt - 直接用
find格式化输出:无需调用ls,利用find的-printf参数自定义输出格式,既能避免重复,也能减少进程创建开销。示例命令(模拟ls -lt的输出格式):find . -type f -atime -1 -printf "%M %u %g %s %Tb %Td %Tk:%TM %p\n"
内容的提问来源于stack exchange,提问作者Shepard Merose
相关产品推荐
相关产品推荐

