在许多文件上运行命令


19

我有一个包含许多文件的文件夹(xyz1,xyz2,一直到xyz5025),我需要在每个文件上运行一个脚本,并获取xyz1.faa,xyz2.faa等作为输出。

单个文件的命令是:

./transeq xyz1 xyz1.faa -table 11

有没有一种方法可以自动执行此操作?也许做一个组合?

Answers:


32
for file in xyz*
do
  ./transeq "$file" "${file}.faa" -table 11
done

这是一个简单的for循环,它将遍历xyz当前目录中所有以该文件开头的文件,并./transeq以文件名作为第一个参数,文件名后跟“ .faa”作为第二个参数,然后是“ -table 11”来调用程序。


4
或者,作为一个班轮:for file in xyz*; do ./transeq "$file" "${file}.faa" -table 11; done。我一直都在打字这种东西。而且,如果您想验证文件名等是否已按所需的方式扩展,则只需在第一次输入echo之后就放一个do,然后再返回您的Shell历史记录,然后第二次删除它即可。
Dave Tweed

"$file".faa作为交互式单行代码的一部分,键入起来稍微容易一些,并且安全,因为.faa它不包含任何需要引用的shell元字符。
彼得·科德斯

2
需要注意的是,如果最终运行了一部分并想重新启动循环,则该xyz*glob也会选择.faa文件。对于bash,请运行shopt -s extglobreference),然后使用for file in xyz!(*.faa) ...来从循环中排除.faa文件。
杰夫·谢勒

24

如果安装GNU Parallel,则可以并行执行以下操作:

parallel ./transeq {} {}.faa -table 11 ::: xyz*

如果您的程序是占用大量CPU的,它应该可以加快很多速度。


6

您可以在bash命令行上执行以下操作:

printf '%s\n' {1..5025} | xargs -l -I {} -t ./transeq xyz{} xyz{}.faa -table 11

我们正在生成1到5025的整数,一个/行,然后将它们一对一地馈送到xargs,xargs将整数封装到其中{},然后以适当的方式将其移植到./transeq命令行中。

如果您没有大括号扩展功能,{n..m}则可以调用该seq实用程序以生成这些数字。

或者,您始终可以通过以下方式模拟数字生成:

yes | sed -n =\;5025q | xargs ...

1
那太复杂了。 for i in {1..5025}; do ./transeq "xyz$i" "xyz$i".faa -table 11; done是更容易思考和输入的方式。如果要在执行命令之前打印命令,请使用set -x
彼得·科德斯

是的,这是正确的,但是在OP中提出问题的方式在我看来只有感兴趣的文件名为xyz1 .. xyz5025。因此,我想如果我们将其用于xyz *,那么我们需要一种方法来拒绝不合格的文件……因此。理想情况下,如果OP希望处理目录中的所有文件,那么为什么要提起1到5025?只需说我希望以规定的方式处理所有文件就足够了。

1
看看我写的循环。它用于for i in {1..5025}获得与您完全相同的结果。您也可以用for ((i=1 ; i<=5025 ; i++)); do ./transeq "xyz$i" "xyz$i".faa -table 11; donebash 编写,但是我通常使用{a..b}范围语法,因为它的键入速度更快。
彼得·科德斯

4

使用find,当文件分散在目录中时很有用

find -name "xyz*" -exec ./transeq {} {}.faa -table 11 \;

4

假设您有多个内核,并且每次调用都可以独立于其余内核运行,那么并行运行将大大提高速度。

相对简单的方法是通过-的-P参数xargs-例如,如果您有4个核心:

echo xyz{1..5025} | \
    xargs -n 1 -P 4 -I{} /path/to/transeq xyz{} xyz{}.faa -table 11

-n 1告诉xargs挑只有一个参数出来的列表中为每个调用的(默认情况下它会通过大量的),以及-P 4告诉它在同一时间产卵4个过程-当一个人死去,一个新的催生。

恕我直言,对于这种简单情况,您无需并行安装GNU- xargs足够。


0

您可以使用 xarg

ls | xargs -L 1 -d '\n' your-desired-command

-L 1 导致一次通过1个项目

-d '\n'ls根据新行分割输出。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.