[英]bash shell scripting: How to group argument list into N items?
這里的用例是我想在一個循環中使用一組文件,例如*
和構建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
請參閱xargs
及其-n
選項。
ls | xargs -n3 command
如果文件名包含空格,則可能需要-0
選項並使用-print0
find
以列出文件。
另一個選擇是使用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
我采用手動直接字符串累積方法。 像這樣的東西。
我正在制作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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.