所以基本上我需要找到一堆 .csv 文件,然后使用我在所有文件上编写的脚本。我有
find . -type f -name "*.csv" | xargs ./extractdata
这是可行的,但只能处理一个文件,而不是我需要的所有文件。帮助?
答案1
它不起作用的原因是它xargs
会在命令行中塞满尽可能多的文件。
因此,您的“extractdata”脚本将立即接收所有文件,并且可能仅处理第一个参数。即你有N个文件,你执行一脚本与全部文件作为参数。
您需要使用-n
参数:
... | xargs -n 1 ./extractdata
这样你就有了 N 个文件,你可以执行 N 个脚本一每个文件参数。
find
但是,这与使用该选项运行几乎完全相同-exec
(区别之一是您按找到的顺序处理文件,而使用管道时,您可以在使用sort
and/or传递后执行此操作grep
):
find ... -exec /path/to/extractdata \{\} \;
您也许还可以使用并行执行脚本parallel
:这一次执行四个实例,可能根据数据、RAM 和硬件实现更高效的处理:
... | parallel -n 1 -j 4 ./extractdata
(如果“extractdata”使用具有固定名称的临时文件,这不是一个好的做法,那么并行执行的两个或多个脚本将写入彼此的临时文件,从而弄乱事情)。
答案2
答案3
有很多方法可以解决这个问题,例如,您可以要求find
调用脚本,如下所示:
$ find . -type f -name "*.csv" -exec your_script {} ;
{} 是每次找到的文件名。
您可能需要转义这些字符:
$ find . -type f -name "*.csv" -exec your_script \{\} \;