ファイルをペアとして処理する方法

ファイルをペアとして処理する方法

ファイルをペアとして扱う必要があります。だから私が持っている場合:

00000.nii.gz   
00001.nii.gz
00002.nii.gz
00003.nii.gz 

等... (nii.gz映像共鳴処理時に使用される拡張子です。)ファイル00000.nii.gz00001.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桁の文字列に整形します。printfii+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

関連情報