次の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
使用find
とsed
:
#!/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
。