2016-01-22 167 views
0

我想在bash forloop中读取文件。但我不知道如何把这个脚本写出来。Bash在for循环中读取多个文件(作为执行论据)

for i in $(seq 0 $step 10) 
do 
    echo "Rendering: "$((i + j)) 
    python auto_fine.py density000000.vtu velocity000000.vtu $((i + j)) 
done 

每个循环我需要调用

I - > 0蟒auto_fine.py density000000.vtu velocity000000.vtu

我 - > 1个蟒auto_fine.py density000010.vtu velocity000010。 VTU

我 - > 2蟒蛇auto_fine.py density000020.vtu velocity000020.vtu

回答

1

Bash可以做到这一点,而不需要像seq这样的外部工具。

for i in {0..100}; do 
    [[ $i = *0 ]] || continue 
    python auto_fine.py density$(printf '%06d' $i).vtu velocity$(printf '%06d' $i).vtu 
done 

这将使用模式匹配(*0)到您的列表限制为每10号,这是一个黑客位,但将努力对您的样本数据。

,你可以对直接在零填充数字字符串交替循环:

for i in $(printf '%05d0 ' {0..10}); do 
    python auto_fine.py density$i.vtu velocity$i.vtu 
done 

此选项显示每10个项目由增加数量,成为十位数字后加一个零在printf格式。如果你想要更多的任意排序,您可以使用乘法器,仍然没有产卵外部进程:

low=0 
high=100 
mult=10 

for i in $(eval echo {$low..$((high/mult))}); do 
    n=$(printf '%06d' $((i*mult))) 
    python auto_fine.py density$n.vtu velocity$n.vtu 
done 

注意eval,它可以让你扩大变量在序列表达式中使用。 (如果您从外部获取这些数字,请在使用它们之前验证它们)

如果您使用bash版本4(即不是OSX上的本机版本),还可以使用增量序列表达式。从手册页:

序列表达式的形式为{x..y[..incr]},其中xy是 任一整数或单个字符,incr,可选的增量, 是整数。

因此,也许:

low=0 
high=100 
mult=10 

for i in $(eval "printf '%06d ' {$low..$high..$mult}"); do 
    python auto_fine.py density$i.vtu velocity$i.vtu 
done 

注意,在表达式序列,该序列的第一成员是提供,而不是仅仅一个乘法器的乘积的第一个号码。我们在printf周围引用了引号,以确保序列表达式被eval扩展,并且不被命令替换($(..))解释。

+0

好的。但请注意,OP可能需要'seq',因为它允许您指定步骤,甚至更重要的是使用变量。 – fedorqui

+0

@fedorqui - 谢谢。在第一个例子中,我们通过跳过不以0结尾的数字来排序10。第二个例子中,由于printf格式字符串,我们隐含地加10。第三,我们使用乘数在序列表达式上创建* real *增量。 – ghoti

+0

@fedorqui - 当然,我意识到只有在写完这个答案之后,我才在OSX中进行测试。 '{x..y..incr}'符号是用bash 4引入的,并且很好地处理了序列。 – ghoti

-1

循环在当前目录中的所有文件很简单:

for i in $(ls -1) 
do 
    # your code here, variable is referenced with $i 
done 

什么是您正在使用的变量j

2

在我看来,你需要填零的数字sed提供给你:

How to zero pad a sequence of integers in bash so that all have the same width?看到的,你需要做这样的事情

$ seq -f "%06g" 0 10 100 

将返回:

000000 
000010 
000020 
... 
000100 

All together,

for i in $(seq -f "%06g" 0 10 100) 
do 
    # echo "Rendering: "$((i + j)) -- not sure what this does 
    python auto_fine.py density$i.vtu velocity$i.vtu 
done 
+0

'/ usr/bin/seq'是一个外部二进制文件,但'printf'是一个内置的。为什么不使用'printf'? – ghoti

+0

@ghoti你的意思是'为我在printf“%06g”{1..10}''?这听起来像一个非常好的主意。 – fedorqui

+0

我得到像这样的错误:[bash:000008:值太大的基地(错误标记是“000008”)] – Mathi