对多个文件运行命令

Man*_*uel 20 scripting shell-script text-processing files bioinformatics

我有一个文件夹,里面有很多文件(xyz1、xyz2,一直到 xyz5025),我需要在每个文件上运行一个脚本,得到 xyz1.faa、xyz2.faa 等等作为输出。

单个文件的命令是:

./transeq xyz1 xyz1.faa -table 11
Run Code Online (Sandbox Code Playgroud)

有没有办法自动做到这一点?也许是一个for-do组合?

Jef*_*ler 33

for file in xyz*
do
  ./transeq "$file" "${file}.faa" -table 11
done
Run Code Online (Sandbox Code Playgroud)

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

  • 或者,作为单行:`for file in xyz*; 做 ./transeq "$file" "${file}.faa" -table 11; 完成`。我一直在打这种东西。如果你想验证文件名等是否按照你想要的方式扩展,只需在第一次在 `do` 之后添加一个 `echo`,然后返回你的 shell 历史记录并在第二次删除它时间。 (4认同)
  • 请注意,如果您以部分运行结束并想重新启动循环,`xyz*` glob 也会选择 .faa 文件。对于 bash,运行 `shopt -s extglob`([reference](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html#Pattern-Matching)),然后使用 `for file在 xyz!(*.faa) ...` 中排除 .faa 文件通过循环发送。 (2认同)

hsc*_*hou 24

如果您安装GNU Parallel,您可以像这样并行执行:

parallel ./transeq {} {}.faa -table 11 ::: xyz*
Run Code Online (Sandbox Code Playgroud)

如果你的程序是 CPU 密集型的,它应该会加速很多。


小智 6

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

printf '%s\n' {1..5025} | xargs -l -I {} -t ./transeq xyz{} xyz{}.faa -table 11
Run Code Online (Sandbox Code Playgroud)

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

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

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

yes | sed -n =\;5025q | xargs ...
Run Code Online (Sandbox Code Playgroud)