通过并行化测试加速 find rm 命令

通过并行化测试加速 find rm 命令

我想递归删除目录和子目录中行数少于10的所有文件,目前正在使用以下命令

find . -type f -name "*.txt" | while read; do     
(($(cat $THISFILE | wc -l) < 10)) && rm -vf "$THISFILE"; done 

我已经使用findwithxargs来并行化一些命令,但是在这里,我不知道如何做到这一点,因为在 with 行上进行了测试wc -l

有(或没有!)我怎样才能让速度更快xargs

答案1

发现本身不能并行执行(据我所知)。

xargs 可以做到这一点,使用 xargs 做到这一点的最简单方法是将其包装在 shell 脚本中。

但在此之前,您应该优化自己的状况。cat除非实际连接文件,否则没有用。您不需要计算所有行数来确定文件是否有 10 行或更多行。所以我建议这样的条件:

[ $(head -n 10 "$file" | wc -l) -lt 10 ] && echo rm "$file"

它最多只读取前 10 行,如果没有那么多则删除该文件(rm 有点危险,所以我添加了echo这样你可以先测试它)。与 cat 不同,head 实际上在达到 10 行后停止读取,因此如果目录中的文件超过 10 行,这应该会大大加快该过程。

像这样包装在 shell 脚本中:

#!/bin/bash

for file in "$@"
do
    [ $(head -n 10 "$file" | wc -l) -lt 10 ] && echo rm "$file"
done

您可以使用 find + xargs 进行多重处理:

find . -type f -name "*.txt" -print0 | xargs -0 -P 4 -n 8 ./rm10lines.sh

(四个进程-P 4)和-n 8(每次调用 shell 脚本 8 个参数)是示例,请根据您的喜好进行调整。如果您知道有很多文件,请使用较大的 -n 来通过重新生成 shell 脚本来减少开销。

相关内容