ファイルを繰り返すためのBashスクリプト

ファイルを繰り返すためのBashスクリプト

次のbashループがあります。

for file in /home/directory/*; do
filename=${file##*/}
echo "$filename"
##execute command here with $filename
done

特定のファイルのみを選択する方法は?たとえば、test-file.zipなど、ファイル名に「マスク」が含まれていないファイルのみを選択します。また、各ループの繰り返しで「マスク」が追加された変数(test-file-mask.zip)を宣言しようとします。どうすればいいですか?

編集する:

もう少し正確なはずです。 ;) たとえば、ファイルの多いフォルダがあります

test_001.nii.gz
test_001-mask.nii.gz
test_002.nii.gz
test_002-mask.nii.gz
....

これは、各ファイルに「マスク」ファイルもあることを意味します。ここで、各ループの反復でマスクされていないファイルとマスクされたファイルを選択したいと思います。たとえば、最初のループ反復では、 $file は test_001.nii.gz を指し、 $mask は test_001-mask.nii.gz を指す必要があり、2 番目のループ反復では $file は test_002.nii.gzを指す必要があります。 $mask は test_002.nii.gz を指す必要があります。 test_002-mask.nii.gzなど

答え1

[[ ... ]]aの右側はパターンにする==ことができます。

for file in /home/directory/* ; do
    if [[ $file != *-mask.nii.gz ]] ; then
        filename=${file##*/}
        mask=${filename%.nii.gz}-mask.nii.gz
        echo "$filename" "$mask"
    fi
done

答え2

使用findsed:

#!/bin/bash
find /home/directory/* -type f -name '*.gz' \
-not -name '*mask*' | while IFS= read -r file; do

    mask="$(sed 's/^\([^.]*\)/\1-mask/' <<<"$file")"

done

文字列を含まないディレクトリ名を検討してくださいmask

関連情報