如何加载文件并将所有结果放在 bash 中的单独文件中?

How to load files and all result put in separate files in bash?

我有几个 *.afa 格式的文件。我需要删除它们之间的间隙,我有一个工具可以做到这一点。 这是一个事实。 fac 中的命令是:

fac -g inputFile.afa outputFile.afa

而且它运行良好。但是现在我需要自动处理100xx的文件,我想编写脚本。但结果是,我需要有一个未更改的输入文件,并导致文件 R 在文件名中排在第一位。 例如:

Before:
1.afa 30kb
2.afa 30kb
3.afa 40kb

After:
1.afa 30kb
R1.afa 15kb
2.afa 30kb
R2.afa 15kb
3.afa 40kb
R3.afa 20kb

Bash对我来说很陌生。我知道我应该学习它,我会的,但我需要快速得到结果。 现在我只写这个:

#!/bin/bash
ls *.afa | parallel "fac -g {} >{R.}.afa"

但是: 1. 我不能写一个正确的正则表达式来在第一个字母的 R 中的新文件中打印结果 2. 只有最后一个结果保存在一个文件中。那不会为每个文件生成结果。

有人可以帮助我吗?

您应该能够在 bash shell 中的一行中执行此操作,假设您位于所有 .afa 文件所在的文件夹中:

l=($(ls *.afa)); for f in ${l[@]}; do fac -g $f "R$f"; done
# Should also work without "" around R$f.

正如@codeforester 指出的那样,这样更好(更安全):

for f in *.afa; do fac -g $f "R$f"; done

这可以扩展为:

l=(*.afa) # bash array for all .afa files.
for f in ${l[@]}; do # loop over array
    fac -g $f R$f; # Run original command for each $f
done

您不能为 parallel 编写正确的正则表达式的原因是没有涉及正则表达式。 {} 简单地替换为引用的名称。如果你想在前面加上 R 它只是 R{}:

#!/bin/bash
parallel "fac -g {} R{}" ::: *.afa

由于来自 ls 的管道被认为不是好的做法,因此此示例改用 glob 扩展。