【发布时间】:2022-01-21 09:38:06
【问题描述】:
我正在尝试循环遍历文件夹中的图像列表,以使用 fsl 数学应用阈值。但是,我已经在 for 循环中停留了几个小时并且没有找到解决方案(我可以理解,作为 linux 的初学者)。
我想知道是否有人可以提供一些帮助,以便我可以通过这个问题学习更多基本的 bash 脚本。
问题似乎是由于文件名中的空格,所以我想知道
-
如何绕过这个并让 for 循环运行,或者
-
作为替代方案,如何重命名文件夹中的所有文件以消除空格?
两者都是我想学习的有用的东西。
我一直在尝试类似的东西:
FILES=$(ls *.nii)
echo "$FILES" > FILES.txt
for image in `cat FILES.txt`; do
echo $image
fslmaths $ELEMENT -thr 0.5 -bin.
done
但是,我已经可以在 echo $image 上看到文件没有正确显示,并且文件名将分布在多行上,可能是因为文件名中的空格。
ls *nii
或
cat FILES.txt
两者都给我我想要的列表,如下所示:
CIT168toMNI152_prob_atlas_bilat_1mm__(volume 8).nii
harvardoxford-cortical_prob_Postcentral Gyrus.nii
harvardoxford-cortical_prob_Precuneous_Cortex.nii
juelich_prob_GM Primary somatosensory cortex BA1 L.nii
juelich_prob_GM Primary somatosensory cortex BA1 R.nii
juelich_prob_GM Primary somatosensory cortex BA2 L.nii
juelich_prob_GM Primary somatosensory cortex BA2 R.nii
juelich_prob_GM Primary somatosensory cortex BA3a L.nii
juelich_prob_GM Primary somatosensory cortex BA3a R.nii
juelich_prob_GM Primary somatosensory cortex BA3b L.nii
juelich_prob_GM Primary somatosensory cortex BA3b R.nii
juelich_prob_Left_Premotor_BA6.nii
juelich_prob_Left_Primary_motor_BA4a.nii
juelich_prob_Left_Primary_motor_BA4p.nii
juelich_prob_Right_Premotor_BA6.nii
juelich_prob_Right_Primary_motor_BA4a.nii
juelich_prob_Right_Primary_motor_BA4p.nii
mni_prob_Insula.nii
red_nucleus.nii
talairach_label_Left_Brainstem_Midbrain.nii
talairach_label_Left_Brainstem_Pons.nii
talairach_label_Left_Brainstem_Red_Nucleus.nii
talairach_label_Left Cerebrum.Frontal Lobe.Paracentral Lobule.Gray Matter.Brodmann area 5.nii
talairach_label_Left_Lateral_Dorsal_Nucleus.nii
talairach_label_Left_Lateral_Posterior_Nucleus.nii
talairach_label_Left_Ventral_Lateral_Nucleus.nii
talairach_label_Right_Brainstem_Midbrain.nii
talairach_label_Right_Brainstem_Pons.nii
talairach_label_Right Cerebrum.Frontal Lobe.Paracentral Lobule.Gray Matter.Brodmann area 5.nii
talairach_label_Right_Red_Nucleus.nii
talairach_label_Right_Thalamus_Lateral_Dorsal_Nucleus.nii
talairach_label_Right_Thalamus_Lateral_Posterior_Nucleus.nii
talairach_label_Right_Thalamus_Ventral_Lateral_Nucleus.nii
但是,当我运行 for 循环时
for image in `cat FILES.txt`; do
echo $image
done
我得到这样的东西(这里缩短):
juelich_prob_GM
Primary
somatosensory
cortex
BA1
L.nii
juelich_prob_GM
Primary
somatosensory
cortex
BA1
R.nii
juelich_prob_GM
Primary
somatosensory
cortex
BA2
L.nii
juelich_prob_GM
Primary
somatosensory
cortex
BA2
R.nii
juelich_prob_GM
Primary
somatosensory
cortex
BA3a
L.nii
juelich_prob_GM
Primary
somatosensory
cortex
BA3a
R.nii
juelich_prob_GM
Primary
somatosensory
cortex
BA3b
L.nii
juelich_prob_GM
Primary
somatosensory
cortex
BA3b
R.nii
juelich_prob_Left_Premotor_BA6.nii
juelich_prob_Left_Primary_motor_BA4a.nii
juelich_prob_Left_Primary_motor_BA4p.nii
juelich_prob_Right_Premotor_BA6.nii
juelich_prob_Right_Primary_motor_BA4a.nii
juelich_prob_Right_Primary_motor_BA4p.nii
我也试过了:
echo "${FILES[*]}"
这给了我我想要的列表,但是当我循环它时:
for ELEMENT in "${FILES[@]}"
do
echo $ELEMENT
fslmaths $ELEMENT -thr 0.5 -bin
done
它不会回显整个文件名,只有空格之前的部分。
非常感谢任何帮助。
【问题讨论】:
-
顺便说一句:Why not parse
ls? -
正确的方法是
for file in ./*.nii; do fslmaths "$file" -thr 0.5 -bin; done。你可以考虑阅读Bash Pitfalls #1 -
欲了解更多选项,请阅读BashFAQ #20: "How can I find and safely handle file names containing newlines, spaces or both?" 此外,您几乎应该总是用双引号引用变量引用。 shellcheck.net 擅长指出这个错误(以及许多其他常见的脚本错误)。