bashshell脚本:如何将参数列表分组为N个项目?
这里的用例是,我希望获取一组文件,比如bashshell脚本:如何将参数列表分组为N个项目?,bash,shell,Bash,Shell,这里的用例是,我希望获取一组文件,比如*,并在循环中使用它们构建arglist,N。比如说, $ ls a.jpg b.jpg v.jpg z.jpg 123.jpg 1234.jpg N这里有两个,我想运行例如命令a.jpg b.jpg,命令v.jpg,z.jpg,等等 我怎么做 for file in *; do command [???] done 它不必使用for循环。希望有一个我还不知道的UNIX实用程序能够稍微重新排列arg列表。或者也许我得用tr和IFS做些有趣的事情
*
,并在循环中使用它们构建arglist,N
。比如说,
$ ls
a.jpg
b.jpg
v.jpg
z.jpg
123.jpg
1234.jpg
N
这里有两个,我想运行例如命令a.jpg b.jpg
,命令v.jpg,z.jpg
,等等
我怎么做
for file in *; do
command [???]
done
它不必使用for循环。希望有一个我还不知道的UNIX实用程序能够稍微重新排列arg列表。或者也许我得用tr
和IFS
做些有趣的事情
如果我的文件以数字命名,或者如果我只想使用数字而不是对全局扩展文件进行操作(本例中的N
=3),我可以这样做:
这就产生了
0 1 2
3 4 5
6 7 8
9 10 11
我采用了一种手动直接累积法。像这样的 我正在制作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
请参阅
xargs
及其-n
选项
ls | xargs -n3 command
如果文件名包含空格,则可能需要使用
-0
选项和使用-print0
查找
来列出文件。另一个选项是使用bash数组:
files=(*)
for number in $(seq 0 3 $((${#arr[@]}-1)) ); do
echo "${files[number]}" "${files[number+1]}" "${files[number+2]}"
done
在纯
bash
中,这里有一种非常干净的方法,不需要xargs
,也不需要正确处理文件名中的空格:
set -- *
while [ $# -gt 0 ]; do
file1="$1"; shift
file2="$1"; shift
# ./do_something "$file1" "$file2"
done
我在写这篇文章的时候注意到“一个新的答案…”-你抢先了我。我知道这一点。为什么我忘记了
xargs
可以做到这一点xargs
甚至可以并行化脚本。对我的imagemagick脚本也非常有用。@StevenLu这对文件名中的空格不起作用,但在您的特定情况下,这可能不是问题。请参阅我的答案,以了解不带xargs
的备选方案。
set -- *
while [ $# -gt 0 ]; do
file1="$1"; shift
file2="$1"; shift
# ./do_something "$file1" "$file2"
done