ループ内のファイル名の末尾(拡張子の前)にアクセスする方法

ループ内のファイル名の末尾(拡張子の前)にアクセスする方法

ファイル名が次に終わるフォルダがあり、.TIFforループを作成しました。

for i in *.TIF

ループから2種類のファイルの終わり(B4.TIFやB5.TIFなど)を取得したいと思います。

しかし、私はファイル名の最後の4文字を取得するのではなく、最後に追加しました。

do ...... ${i}_B4.TIF -B ${i}_B5.TIF

私が望む結果は、いくつかの計算を実行するためにこれらのファイル名を取得することです。

以下はフォルダ内のファイルの例です。

LC08_L1TP_195020_20170224_20170301_01_T1_B4.TIF  
LC08_L1TP_195020_20171107_20171121_01_T1_B4.TIF

LC08_L1TP_195020_20170224_20170301_01_T1_B5.TIF  
LC08_L1TP_195020_20171107_20171121_01_T1_B5.TIF

これは計算を実行するために使用するスクリプトです。

for i in *.TIF   
do 
    gdal_calc.py -A ${i}_B4_SA.TIF -B ${i}_B5_SA.TIF --type=Float32
--outfile=~/Geodata/goteborg/croped/ndvi/${i}_NDVI.TIF --calc="(B-A)/(B+A)"

done

最終出力はマイナスB4とB5になります。したがって、${i}_B4_SA.TIF -B ${i}_B5_SA.TIF次の2つのファイル名が生成されます。

LC08_L1TP_195020_20170224_20170301_01_T1_B4.TIF - 
LC08_L1TP_195020_20170224_20170301_01_T1_B5.TIF

答え1

ペアの半分を構成するファイルを繰り返し、各ファイルに対して対応するペアと出力ファイルのファイル名を構成します。

for b4_file in ./*_B4.TIF; do
    b5_file="${b4_file%_B4.TIF}_B5.TIF"
    ndvi_file="$HOME/Geodata/goteborg/croped/ndvi/${b4_file%_B4.TIF}_NDVI.TIF"

    if [ ! -f "$b5_file" ]; then
        printf 'Expected to find "%s" to go with "%s", but did not\n' "$b5_file" "$b4_file" >&2
        continue
    fi

    # do whatever it is you need to do with "$b4_file" and "$b5_file"

    gdal_calc.py -A "$b4_file" -B "$b5_file" --type=Float32 \
        --outfile="$ndvi_file --calc="(B-A)/(B+A)"

done

答え2

まず、Unixにはファイル拡張子のようなものがないことに注意してください。.もう一つのキャラクターです。そのため、ここではファイルの約1/2を検索して名前の末尾を削除して(2つの異なる方法で)再挿入する準備をしています。

これはうまくいきますが、潜在的なバグがある可能性があります。

for f in *_B5.TIF   
do 
    i="$(echo "$f" | sed -r -e 's/(.*)_B5.TIF/\1/')"
    … ${i}_B4_SA.TIF -B ${i}_B5_SA.TIF …
done

これはもう少し頑丈です。

find . -iname "*_B5.TIF" -print0 | sed -0r -e 's/(.*)_B5.TIF/\1/' | xargs -0 -i … {}_B4_SA.TIF -B {}_B5_SA.TIF …

私が持っていないのでテストしてみてください(マイナーなバグかもしれません)。そしてエラーチェックもありません。プログラムは間違った一致を確認する必要があります。

答え3

Bashを使用するときは、次のものを使用できます。パラメータ拡張末尾を切り取り、ファイル名の共通部分を新しい変数に保存します。

for f in *_B4.TIF ; do
    i="${f%_B4.TIF}"
    gdal_calc.py -A "${i}_B4.TIF" -B "${i}_B5.TIF" --outfile=".../${i}_NDVI.TIF"
done

関連情報