【问题标题】:For-loop through ls of files in bash script, filenames containing spaces [duplicate]For循环遍历bash脚本中的文件,文件名包含空格[重复]
【发布时间】:2022-01-21 09:38:06
【问题描述】:

我正在尝试循环遍历文件夹中的图像列表,以使用 fsl 数学应用阈值。但是,我已经在 for 循环中停留了几个小时并且没有找到解决方案(我可以理解,作为 linux 的初学者)。

我想知道是否有人可以提供一些帮助,以便我可以通过这个问题学习更多基本的 bash 脚本。

问题似乎是由于文件名中的空格,所以我想知道

  1. 如何绕过这个并让 for 循环运行,或者

  2. 作为替代方案,如何重命名文件夹中的所有文件以消除空格?

两者都是我想学习的有用的东西。

我一直在尝试类似的东西:

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

它不会回显整个文件名,只有空格之前的部分。

非常感谢任何帮助。

【问题讨论】:

标签: bash for-loop ls spaces


【解决方案1】:

只需使用find

find . -name '*.nil' -print -exec fslmaths '{}' -thr 0.5 -bin. \;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多