【问题标题】:concatenate grep output to an echo statement in UNIX将 grep 输出连接到 UNIX 中的 echo 语句
【发布时间】:2015-02-02 21:42:41
【问题描述】:

我正在尝试在单行上输出给定路径中的目录数。我的愿望是输出这个:

X 多个目录

目前,通过我的 bash 脚本,我得到了这个:

很多

目录

这是我的代码:

ARGUMENT=$1

ls -l $ARGUMENT | egrep -c '^drwx'; echo -n "directories"

如何修复我的输出?谢谢

【问题讨论】:

    标签: shell unix grep


    【解决方案1】:

    我建议

     echo "$(ls -l "$ARGUMENT" | egrep -c '^drwx') directories"
    

    这使用 shell 的最终换行符删除功能来替换命令。

    【讨论】:

      【解决方案2】:

      不要通过管道传送到ls 输出和计数目录,因为如果文件/目录名称中使用了特殊字符,您可能会得到错误的结果。

      要计算目录使用:

      shopt -s nullglob
      arr=( "$ARGUMENT"/*/ )
      echo "${#arr[@]} directories"
      
      • glob 末尾的 / 将确保仅匹配 "$ARGUMENT" 路径中的目录。
      • shopt -s nullglob 是为了确保在 glob 模式失败时返回空结果(给定参数中没有目录)。

      【讨论】:

      • shopt:找不到命令;这受到“全世界都是 Linux/bash 系统”的影响。
      • shopt 在 BASH 中找不到?
      • 让这个简单的任务适用于任何 shell 有这么难吗?为什么不必要的bashisms?我相信尽早教授可移植性并避免解决方案仅适用于有限的系统。
      • 不必要的 bashisms 适用于 avoiding parsing ls command
      【解决方案3】:

      作为替代解决方案

      $ bc <<< "$(find /etc -maxdepth 1 -type d | wc -l)-1"
      116
      

      另一个

      $ count=0; while read curr_line; do count=$((count+1)); done < <(ls -l ~/etc | grep ^d); echo ${count}
      116
      

      文件夹名称中的空格可以正常工作

      $ ls -la
      total 20
      drwxrwxr-x  5 alex alex 4096 Jun 30 18:40 .
      drwxr-xr-x 11 alex alex 4096 Jun 30 16:41 ..
      drwxrwxr-x  2 alex alex 4096 Jun 30 16:43 asdasd
      drwxrwxr-x  2 alex alex 4096 Jun 30 16:43 dfgerte
      drwxrwxr-x  2 alex alex 4096 Jun 30 16:43 somefoler with_space
      
      $ count=0; while read curr_line; do count=$((count+1)); done < <(ls -l ./ | grep ^d); echo ${count}
      3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-24
        • 1970-01-01
        • 2015-08-30
        • 1970-01-01
        • 2020-01-31
        • 1970-01-01
        • 1970-01-01
        • 2013-08-13
        相关资源
        最近更新 更多