这里的用例是我想要一组文件,例如*
,并在循环中构建arglists,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列表。或者我可能会对tr
和IFS
做一些喜欢的事。
如果我的文件以数字命名,或者我只是想使用数字而不是对全球扩展文件进行操作(这个例子有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
答案 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