在一行上对多个文件运行多个命令

在一行上对多个文件运行多个命令

我试图在同一行上为多个文件运行多个命令。我对 Linux 的经验很少,并且在使用此命令时遇到了问题:

tail -n +3 "/usr/local/tmp/csce215/election2008/"*/*.csv | head -n -1 > polls.csv

我试图通过连续使用 tail 和 head 来获取每个文件的“中间部分”。不幸的是,tail 正确地为每个文件运行,但 head 似乎只为最后一个文件运行。是否可以通过一个命令来完成此操作,或者是否有更好的方法来执行此操作?我更喜欢使用头部和尾部。

答案1

问题是tail创建一个单一的数据流来传递给head,这就是那里所使用的。

相反,您需要处理每个文件tailhead在 polls.csv 文件中使用该结果。

一行代码看起来像这样:

shopt -s nullglob; for name in "/usr/local/tmp/csce215/election2008/"*/*.csv; do echo "==> $name" >> polls.csv; tail -n +3 "$name" | head -n -1 >>polls.csv; echo "" >> polls.csv; done;

如果没有可查找的 *.csv 文件,shopt -s nullglob 可防止不必要的操作。

当然,由于这使用附加到文件进行重定向,因此您需要在每次使用后删除 polls 文件,否则它会继续增长。或者,修改命令以在开始时破坏它:

echo "" > polls.csv; shopt -s nullglob; for name in "/usr/local/tmp/csce215/election2008/"*/*.csv; do echo "==> $name" >> polls.csv; tail -n +3 "$name" | head -n -1 >>polls.csv; echo "" >> polls.csv; done;

由于屏幕限制,它不会显示为一行,但无论如何都将其键入一行。复制/粘贴应该将其保留为一行。

相关内容