在一个sh脚本中,我试图在文件夹中创建一个文件名列表,然后在其上循环以检查两个连续的文件名是否能很好地响应"表达式标准"。
在我的文件夹中: file1.nii file1_mask.nii file2.nii file2_mask.nii 等...... 未定义的文件数。但如果filex.nii存在,则必须有filex_mask.nii
在用户修改的.txt文件中。 它包含:
file1.nii tab一些参数\ n
file2.nii tab一些参数\ n
等等......
脚本需要很长时间才能运行,例如,掩码文件仅在几个小时后使用。 所以我想在.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 我想要file1.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"找不到
这是我现在的解决方案,基于glenn回答:
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
那么现在唯一的问题是它总是退出,即使错误等于0而且我也不知道为什么......
答案 0 :(得分:1)
我会这样做:
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