Bash 脚本:解析子目录而不是当前目录

Bash 脚本:解析子目录而不是当前目录

我正在尝试解析子目录名称,但输出将名称分解为单个单词。

例如。如果子目录名称是“Hello World”,则输出将为:

.  
Hello  
World  

以下代码有效,但输出包括我不想要的当前目录:

find "$my_dir" -maxdepth 1 -type d -print0 |
    while IFS= read -rd '' dir;
        do 
            echo "$dir"; 
        done

我试图包含一个 if 语句,该语句从输出中消除当前目录,但代码似乎仍然看到每个子目录名称的单独单词:

find "$my_dir" -maxdepth 1 -type d -print0 |  
    while IFS= read -rd '' dir;
        do 
            if ["$dir" != "."]; then
                echo "$dir"
            fi
        done

答案1

空格的中断发生在您的read命令中,但您无论如何都不需要这样做。另外,你的if逻辑也有问题。仅当my_dir等于 时它才起作用.,否则find不会.在其输出中生成 a 。最后,您在示例中声明,您只需要目录的名称,而不是整个路径,但按照您编写的方式,find会将路径传递给标准输出。

这是一个更简单的解决方案:

find "$my_dir" -maxdepth 1 -type d -exec basename {} \;|tail -n +2

这里的技巧是tail命令。您想要$my_dir从输出中排除起始目录 ( )。find始终首先输出此目录(除非您明确要求深度优先遍历),因此您只需从结果输出中删除第一行即可。

答案2

如果有,请使用该-mindepth选项,该选项可在此处用于排除树中的最顶层目录

find "$my_dir" -mindepth 1 -maxdepth 1 -type d -print0

但是,由于您还-maxdepth限制了深度,为什么不只使用for循环

for dir in "$my_dir"/*
do
    [[ -d "$dir" ]] || continue    # only directories
    echo "${dir/*\/}"              # just basename
done

相关内容