ファイルをペアとして扱う必要があります。だから私が持っている場合:
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
ファイル名の数字はゼロで埋められた5桁の数字で、質問とコメントの時々4桁の文字列はスペルエラーであると仮定します。
#!/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
0から大きな数字まで2ずつ繰り返します。繰り返しごとに、2回の呼び出し(1つのforと1つ)i
の変数を使用して2つのファイル名を設定します。書式指定子は、整数をゼロで埋められた5桁の文字列に整形します。printf
i
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