bash shell脚本:如何将参数列表分组为N个项目?

时间:2013-12-10 01:51:56

标签: bash shell

这里的用例是我想要一组文件,例如*,并在循环中构建arglists,N。例如,

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

N这里有两个,我想要运行,例如command a.jpg b.jpgcommand 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

4 个答案:

答案 0 :(得分:5)

请参阅xargs及其-n选项。

ls | xargs -n3 command

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

这是一个非常干净的纯bash方式,没有xargs,并且正确处理文件名中的空格:

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

答案 3 :(得分: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