代码之家  ›  专栏  ›  技术社区  ›  Chan

将ls输出存储在变量中并拆分它是不起作用的

  •  1
  • Chan  · 技术社区  · 6 年前
    #!/usr/bin/bash
    
    dirs="$(ls /)"
    IFS=' ' read -a dir <<<"$dirs"
    for item in "${dir[@]}"; do
        if [[ $item != "proc" ]]; then
            du -sh /$item
        fi
    done
    

    ls / bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var ,但结果只有一项 0 /bin ,如果我改为

    #!/usr/bin/bash
    
    dirs="bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var"
    IFS=' ' read -a dir <<<"$dirs"
    for item in "${dir[@]}"; do
        if [[ $item != "proc" ]]; then
            du -sh /$item
        fi
    done
    

    结果将是正确的,如何使它工作?

    4 回复  |  直到 6 年前
        1
  •  3
  •   Inian    6 年前

    这一点在几篇帖子中多次被提及。不要使用 ls 以编程方式。它有几个陷阱。看到了吗 Why you shouldn't parse the output of ls(1)

    您所需要的只是shell本身提供的glob扩展,以列出 / 目录。你也是 不应该 使用数组!

    shopt -s nullglob
    topDirs=(/*/)
    

    topDirs 数组将包含根目录下的所有文件夹名,您可以使用循环对其进行解析,

    for dir in "${topDirs[@]}"; do
        if [[ $dir != "/proc/" ]]; then
            du -sh "$dir"
        fi
    done
    

    ls / 不是列出目录的有效全局扩展,它列出 二者都 长征 dirs 将有新行分隔的内容,所以你的逻辑分裂 IFS=' ' 从未 工作。它只会存储返回的列表中的第一行。你应该用 mapfile readarray

    mapfile -t dir <<<"$dirs"
    

    但整个逻辑都有问题,因为 长征

        2
  •  1
  •   Poshi    6 年前

    你正在做一些简单得多的困难的事情:

    find / -maxdepth 1 -type d -a ! -path / -a ! -path /proc | xargs du -sh
    

    find / /proc ,最后你用 xargs du 为了计算尺寸。

        3
  •  1
  •   kabanus    6 年前

    IFS 不需要线路。如果您确定没有带空格的目录(从您的 如果

    dirs="$(ls /)"
    for item in $dirs; do
        if [[ $item != "proc" ]]; then
            du -sh /$item
        fi
    done
    

    请注意,可以省略 [@] 同样,循环将迭代单词(因此文件夹中的空格将打破这一点)。更好的是:

    for item in /*/; do
        if [[ $item != "proc" ]]; then
            du -sh "$item"
        fi
    done
    

    还将处理带有空格的目录。

        4
  •  0
  •   Ole Lukøje    6 年前

    mapfile -t dirs <<<"$(ls /)"