You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免双xargs管道?能否合并两类文件清理命令为单行?

问题解答

一、避免两次xargs优化.pkl文件父目录删除命令

你的原命令会因为同一目录下多个符合条件的.pkl文件重复执行rm -r,同时用到两次xargs。可以通过以下两种方式优化:

1. 仅保留一次xargs并添加去重

利用sort -u避免重复删除同一目录,命令如下:

find path_to_dir/.cache -type f -name "*.pkl" -mtime +30 -exec dirname {} + | sort -u | xargs rm -r

2. 完全不使用xargs,用bash子进程处理

通过-exec bash -c直接在find内部处理去重和删除,更严谨:

find path_to_dir/.cache -type f -name "*.pkl" -mtime +30 -exec bash -c '
    dirs=$(dirname "$@" | sort -u)
    for d in $dirs; do
        rm -r "$d"
    done
' _ {} +

这里的_是bash脚本的占位参数,用来填充$0,避免文件名覆盖脚本位置参数。

二、合并两项任务为一行命令

直接用分号分隔两个处理命令即可,逻辑清晰且避免重复:

find path_to_dir/.cache -type f -name "*.pkl" -mtime +30 -exec bash -c 'for d in $(dirname "$@" | sort -u); do rm -r "$d"; done' _ {} +; find path_to_dir -type f -name "*.log" -mtime +30 -delete

如果想尝试用单个find命令处理(需确保逻辑不冲突),可以用分组条件,但可读性稍差;推荐上面分号分隔的写法,更易维护:

find path_to_dir \( -path "*/.cache/*.pkl" -type f -mtime +30 -exec bash -c 'dirs=$(dirname "$@" | sort -u); for d in $dirs; do rm -r "$d"; done' _ {} + \) -o \( -name "*.log" -type f -mtime +30 -delete \)

内容的提问来源于stack exchange,提问作者Hekri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:20:59