如何使用 find 在多个文件上执行脚本?

如何使用 find 在多个文件上执行脚本?

所以基本上我需要找到一堆 .csv 文件,然后使用我在所有文件上编写的脚本。我有

find . -type f -name "*.csv" | xargs ./extractdata

这是可行的,但只能处理一个文件,而不是我需要的所有文件。帮助?

答案1

它不起作用的原因是它xargs会在命令行中塞满尽可能多的文件。

因此,您的“extractdata”脚本将立即接收所有文件,并且可能仅处理第一个参数。即你有N个文件,你执行脚本与全部文件作为参数。

您需要使用-n参数:

... | xargs -n 1 ./extractdata

这样你就有了 N 个文件,你可以执行 N 个脚本每个文件参数。

find但是,这与使用该选项运行几乎完全相同-exec(区别之一是您按找到的顺序处理文件,而使用管道时,您可以在使用sortand/or传递后执行此操作grep):

find ... -exec /path/to/extractdata \{\} \;

您也许还可以使用并行执行脚本parallel:这一次执行四个实例,可能根据数据、RAM 和硬件实现更高效的处理:

... | parallel -n 1 -j 4 ./extractdata

(如果“extractdata”使用具有固定名称的临时文件,这不是一个好的做法,那么并行执行的两个或多个脚本将写入彼此的临时文件,从而弄乱事情)。

答案2

另一种选择是fd工具:

fd csv -x ./extractdata

https://github.com/sharkdp/fd

答案3

有很多方法可以解决这个问题,例如,您可以要求find调用脚本,如下所示:

 $ find . -type f -name "*.csv" -exec your_script {} ;

{} 是每次找到的文件名。

您可能需要转义这些字符:

 $ find . -type f -name "*.csv" -exec your_script \{\} \;

相关内容