linux检查文件子目录的数量 - 当子目录搜索不存在时提供错误的变量结果

时间:2013-06-03 14:59:50

标签: linux bash

我创建了一个脚本,该脚本遍历文件的特定子目录,并告诉我每个以s开头的子目录中有多少个文件。我的问题发生在搜索时,子目录无法创建。出于某种原因,当该脚本搜索的子目录不存在时,它将输出替换为另一个先前创建的变量????

我在bash for linux中写这个。

我正在查看以下子目录......

participantdirectory/EmotMRI 
participantdirectory/EmotMRI/firstfour/
participantdirectory/T1

所以,这是我应该得到的输出,当子目录存在且一切正常时。所有文件都是一样的(如果正确的话)。

/home/orkney_01/jsiegel/ruth_data/participants/analysis2/1206681446/20090303/14693
16 in firstfour
776 in EmotMRI folder
2 files in T1 folder

对于没有创建子目录的目录,我得到这个输出......

bash: cd: /home/orkney_01/jsiegel/ruth_data/participants/analysis2/2102770508/20090210 /14616/EmotMRI/firstfour/: No such file or directory

/home/orkney_01/jsiegel/ruth_data/participants/analysis2/2102770508/20090210/14616
776 in firstfour
114 in EmotMRI folder
2 files in T1 folder

我认为,因为firstfour是EmotMRI的子目录,当尚未创建firstfour文件夹时,它会将EmotMRI中的扫描号替换为这个答案吗? EmotMRI中的扫描次数(在这种情况下是正确的)。这是我的下面的脚本。如果发生这种情况,我该如何阻止它这样做呢?

for d in $(cat /home/orkney_01/jsiegel/ruth_data/lists/full_participant_list_location_may20)

do

    if [ -d "$d" ]

            then

                    gr="failed"

                    er="failed"

                    fr="failed"

                    cd $d/EmotMRI/firstfour/

                    gr=$(ls s*| wc -l)

                     echo " "

                    echo "$d"

                    echo "$gr in firstfour"

                    cd $d/EmotMRI/

                    er=$(ls s*| wc -l)

                    echo "$er in EmotMRI folder"

                    cd $d/T1/

                    fr=$(ls s*| wc -l)

                    echo "$fr files in T1 folder"

                    cd $d/EmotMRI

            else

                    echo "$d is currently not available in directory"

    fi

done

cd /home/orkney_01/jsiegel/ruth_data/

echo "Check complete"

我知道你可能会对这个脚本有很多改进,我对linux很新。谢谢你的帮助,

2 个答案:

答案 0 :(得分:0)

您收到了您应该修复的错误消息。 Cd失败,因为您不允许更改为不存在的目录。你的shell将保留在它所在的目录中。看起来你知道如何测试目录的存在,所以你应该这样做,以避免尝试进入不存在的目录。

答案 1 :(得分:0)

目前,无论您是否成功更改工作目录,都将gr设置为ls s* | wc -l的输出。当该CD失败时,它会将您留在以前的任何目录中。

您可以将cd命令合并到其他命令中以设置gr:

gr=$(cd $d/EmotMRI/firstfour/ && ls s* | wc -l || echo failed)

这样,如果你成功进入子目录,gr将被设置为&&之后命令的输出。否则,gr将被设置为||之后的命令输出。你可以用呃和fr做同样的事情。