我想递归删除目录和子目录中行数少于10的所有文件,目前正在使用以下命令
find . -type f -name "*.txt" | while read; do
(($(cat $THISFILE | wc -l) < 10)) && rm -vf "$THISFILE"; done
我已经使用find
withxargs
来并行化一些命令,但是在这里,我不知道如何做到这一点,因为在 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 脚本来减少开销。