如何避免双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
相关产品推荐
相关产品推荐

