为什么find | xargs | ls命令无法列出find找到的子目录文件
问题根因
ls本身不读取管道传入的标准输入内容,你通过管道传递的所有文件路径会被直接忽略,默认仅输出当前工作目录的文件列表,这是命令无法返回子目录文件的核心原因。cat支持读取标准输入内容,所以结构相同的cat命令可以正常打印所有匹配文件的内容,两者的差异来自命令本身的设计逻辑,和管道、xargs组件无关。- 你当前写的
xargs没有指定要执行的命令,仅会将输入的所有文件路径拼接成一行输出,没有起到传递参数给ls的作用。
可用的正确写法
写法1:find+xargs(适配包含特殊字符的文件名)
find . -type f -print0 | xargs -0 ls -lt
说明:
-print0和-0配对使用,即使文件名包含空格、换行、特殊符号也不会出现解析错误,xargs会将所有找到的文件路径作为参数传递给ls -lt,实现全目录文件按修改时间倒序排列。
写法2:find自带exec参数(无需额外调用xargs)
find . -type f -exec ls -lt {} +
说明:
{}会被匹配到的文件路径替换,结尾的+表示一次性将所有匹配结果传递给ls,执行效率和xargs一致,写法更简洁。
写法3:zsh环境下的极简写法
ls -lt **/*(.)
说明:
**/*递归匹配所有子目录内容,后缀(.)限定仅匹配普通文件,不需要调用find即可实现需求。
内容的提问来源于stack exchange,提问作者ratchek
相关产品推荐
相关产品推荐

