循环使用Bash中的空目录内容

问题描述 投票:6回答:2

我正在编写一个shell脚本,我需要在其中循环遍历目录,然后循环遍历其中的文件。所以我写了这个函数:

loopdirfiles() {
    #loop over dirs
    for dir in "${PATH}"/*
    do
        for file in "${dir}"/*
            do
                echo $file
            done
    done
}

问题是它在空目录上回复了类似* path / to / dir / **的内容。

有没有办法使用这种方法并忽略这些目录?

bash loops
2个回答
2
投票

您可以从目录名称中删除*,而不是完全忽略它:

[[ $file == *"*" ]] && file="${file/%\*/}"
#this goes inside the second loop

或者,如果要忽略空目录:

[[ -d $dir && $ls -A $dir) ]] || continue
#this goes inside the first loop

其他方式:

files=$(shopt -s nullglob dotglob; echo "$dir"/*)
(( ${#files} )) || continue
#this goes inside the first loop

或者你可以打开nullglob(由Etan Reisner提到)和dotglob

shopt -s nullglob dotglob
#This goes before first loop.


From Bash Manual

了nullglob

如果设置,Bash允许不匹配任何文件的文件名模式扩展为空字符串,而不是自己。

dotglob

如果设置,Bash包含文件名扩展结果中以“。”开头的文件名。

注意:dotglob包含隐藏文件(名称开头带有.的文件)


6
投票

你可以打开nullglob option。它会导致不匹配的globs扩展为空列表,而不是保持未展开状态。

shopt -s nullglob
© www.soinside.com 2019 - 2024. All rights reserved.