递增列表变量,然后循环播放



在sh脚本中,我正在尝试在文件夹中列出文件名,然后在它上循环以检查两个连续的文件名是否很好地响应"表达式条件"。

在我有的文件夹中: 文件1.nii file1_mask.nii 文件2.nii file2_mask.nii 等。。。 文件数量未定义。但如果Filex.nii存在,它必须有filex_mask.NII

在用户修改的.txt文件中。 它包含:

文件1.nii 选项卡某个参数

file2.nii 选项卡某个参数

等。。。

脚本在运行后需要很长时间才能运行,例如,掩码文件仅在几个小时后使用。 所以我想在.sh开始时检查文件名拼写是否正确以及文件夹中是否存在.txt中的任何文件。 如果没有,请停止.sh并警告用户。不要等待数小时才注意到问题。

现在我尝试了:

test=""
for entry in "${search_dir}"/*
do 
echo  "$entry"
test="${test} $entry"
done

然后我有一个文件名之间有空格的字符串变量,但它也有文件夹名称。 ./search_dir/file1.nii ./search_dir/file1_mask.nii 我想要文件1.nii file1_mask.nii 等...

现在我读取了我的.txt文件并检查其中指定的文件名是否在我的测试变量中。

while read -r line
do
set -- $line
stack=$1
check=False
check2=False
for i in $test; do
echo "$stack.nii" 
echo "$i"
if "${stack}.nii" == "$i";
then
check=True
fi
if "${stack}_mask.nii"=="$i";
then
check2=True
fi
done 

完成<"$txt_file">

但它不起作用。

"$stack_mask.nii"=="$i"

似乎不是比较字符串的好方法 它生成错误: 未找到"file1.nii">

这是我现在的解决方案,基于格伦的答案:

errs=0
while read -r line; do
set -- $line
prefix="${1}.nii"
prefix2="${1}.nii.gz"
if [ -e ${PATH}/$prefix2 ]; then       
echo "File found: ${PATH}/$prefix2" >&2
elif [ -e ${PATH}/$prefix ]; then
echo "File found: ${PATH}/$prefix" >&2
else
echo "File not found: ${PATH}/$prefix" >&2
errs=$((errs + 1))
fi
prefixmask="${1}_brain_mask.nii"
prefixmask2="${1}_brain_maskefsd.nii.gz"
if [ -e ${PATH}/$prefixmask ]; then
echo "Mask file found for ${PATH}/$prefixmask" >&2
elif [ -e ${PATH}/$prefixmask2 ]; then
echo "Mask file found for ${PATH}/$prefixmask2" >&2    
else
echo "Mask file not found: ${PATH}/$prefixmask" >&2
errs=$((errs + 1))
fi
done < "$INPUT"
echo $errs
if [ $errs > 0 ]; then
echo "Errors found"
exit 3
fi

那么现在唯一的问题是它总是退出,即使 errs 等于 0 我不知道为什么......

我会这样做:

errs=0
for f in "$search_dir"/*.mii; do
[[ $f == *_mask.mii ]] && continue   # skip the mask files
prefix=${f%.mii}                     # strip off the extension
if [[ ! -f "${prefix}_mask.mii" ]]; then
echo "Error: $f has no mask file" >&2
((errs++))
fi
done
if [[ $errs -gt 0 ]]; then
echo "Aborting due to errors" >&2
exit 2
fi

这应该非常有效,因为它只需循环浏览一次文件。


现在我们看到输入文件:

errs=0
while read -r mii_file other_stuff; do
prefix="${mii_file%.mii}"
if [[ ! -f ./"$mii_file" ]]; then       # adjust your relative path accordingly
echo "File not found: $mii_file" >&2
((errs++))
elif [[ ! -f ./"${prefix}_mask.mii" ]]; then
echo "Mask file missing for $mii_file" >&2
((errs++))
fi
done < "$txt_file"
if (( errs > 0 )); then
echo "Errors found"
exit 2
fi

相关内容

最新更新