2013-12-10 33 views
2

这里的用例是我想获取一组文件,如*,并在一个循环中与它们一起构建arglists,N。例如,bash shell脚本:如何将参数列表分组为N个项目?

$ ls 
a.jpg 
b.jpg 
v.jpg 
z.jpg 
123.jpg 
1234.jpg 

N这里是两个,我想运行例如, command a.jpg b.jpg,command v.jpg, z.jpg

我该怎么办?

for file in *; do 
    command [???] 
done 

它不必使用for循环。希望有一个我不知道的UNIX实用程序,它能够重新排列arg列表。或者我也许应该用trIFS做一些事情。

以下是我能做到这一点,如果我的文件是可预见的用数字命名,或者如果我只是想用数字而不是水珠扩展的文件进行操作(本例中有N = 3):

for number in {0..10..3}; do 
    echo $number $((number + 1)) $((number + 2)) 
done 

这收益率...

0 1 2 
3 4 5 
6 7 8 
9 10 11 

回答

5

xargs及其-n选项。

ls | xargs -n3 command 

如果你的文件名包含空格,你可能需要的-0选项,find-print0列出文件。

+0

我在写这个当我注意到“一个新的答案......” - 你击败了我。 – Floris

+0

我知道这一点。为什么我忘记了'xargs'可以做到这一点? 'xargs'甚至可以并行化脚本。对我的imagemagick脚本来说也是非常有用的。 –

+0

@StevenLu这不适用于文件名中的空格,但在特定情况下这可能不是问题。看到我的答案没有'xargs'的选择。 – janos

0

我走了一个手动直向字符串积累方法。像这样的东西。

我在制作imagemagick脚本。

i=0 
targdir=$2 
accum= 
for image in $(ls $1); do 
    accum="$accum $image" 
    if [[ $((i % 2)) -eq 1 ]]; then 
     echo testing $accum 
     accum= 
    fi 
    ((i ++)) 
done 
2

另一种选择是使用bash的数组:

files=(*) 
for number in $(seq 0 3 $((${#arr[@]}-1))); do 
    echo "${files[number]}" "${files[number+1]}" "${files[number+2]}" 
done 
1

这里是纯bash一个非常干净的方式,无需xargs,并在文件名中的空格妥善处理:

set -- * 
while [ $# -gt 0 ]; do 
    file1="$1"; shift 
    file2="$1"; shift 
    # ./do_something "$file1" "$file2" 
done