我需要成对处理文件。所以如果我有:
00000.nii.gz
00001.nii.gz
00002.nii.gz
00003.nii.gz
等等...(nii.gz
是成像共振处理过程中使用的扩展)我需要处理文件00000.nii.gz
和00001.nii.gz
一起,然后0002.nii.gz
等等00003.nii.gz
。对于每个输出,我需要重命名它。
答案1
我假设文件名中的数字是五位数的零填充数字,问题和注释中偶尔出现的四位数字符串是拼写错误。
#!/bin/bash
for (( i = 0; i <= 99999; i += 2 )); do
name1=$( printf '%05d.nii.gz' "$i" )
name2=$( printf '%05d.nii.gz' "$(( i + 1 ))" )
if [ -f "$name1" ] && [ -f "$name2" ]; then
printf 'Processing "%s" and "%s" together...\n' "$name1" "$name2" >&2
# use the two files here
else
printf '"%s" or "%s" not found, exiting.\n' "$name1" "$name2" >&2
break
fi
done
循环从零到一个大数,增量为 2。对于每次迭代,它i
在两次调用中使用变量构造两个文件名printf
(一次 fori
和一次 for i+1
)。格式说明%05d
符将整数格式化为以零填充的五位数字字符串。
一旦构造的文件名不再对应于任何现有文件(当前目录中),循环就会退出。
如果文件位于当前目录之外的其他目录中,请将printf
格式字符串从更改'%05d.nii.gz'
为'/path/to/dir/%05d.nii.gz'
.
为了遵守 DRY 原则(“不要重复自己”):
#!/bin/bash
dir='/path/to/dir'
name_fmt="$dir/%05d.nii.gz"
for (( i = 0; i <= 99999; i += 2 )); do
name1=$( printf "$name_fmt" "$i" )
name2=$( printf "$name_fmt" "$(( i + 1 ))" )
if [ -f "$name1" ] && [ -f "$name2" ]; then
printf 'Processing "%s" and "%s" together...\n' "$name1" "$name2" >&2
# use the two files here
else
printf '"%s" or "%s" not found, exiting.\n' "$name1" "$name2" >&2
break
fi
done
答案2
假设您有许多这样的文件:
echo z?
z1 z2 z3 z4 z5 z6 z7 z8 z9
然后要获得情侣,您可以使用:
echo z? | xargs -n2
z1 z2
z3 z4
z5 z6
z7 z8
z9
获得三元组:
echo z? | xargs -n3
z1 z2 z3
z4 z5 z6
z7 z8 z9
xargs 的默认命令是 echo,但您可以提供自己的命令。 xargs 的手册页虽然很长,但最后包含了一些示例。
最美好的祝愿...干杯,drl