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

以冒号作为分隔符的全局/路径名扩展

  •  18
  • mjs  · 技术社区  · 14 年前

    /var/lib/gems/*/bin
    

    转换为一个冒号分隔的文件名字符串(即路径兼容)匹配的模式?

    echo /var/lib/gems/*/bin 会回来的

    /var/lib/gems/1.8/bin /var/lib/gems/1.9.1/bin
    

    /var/lib/gems/1.8/bin:/var/lib/gems/1.9.1/bin 
    

    相反。

    最明显的方法是将空格字符替换为“:”via tr ,但如果文件名本身包含空格字符,则不起作用。

    8 回复  |  直到 14 年前
        1
  •  20
  •   Sean    14 年前

    实际上,我想到了一个更好的解决方案:使用shell函数。

    function join() {
        local IFS=$1
        shift
        echo "$*"
    }
    
    mystring=$(join ':' /var/lib/gems/*/bin)
    
        2
  •  11
  •   Dennis Williamson    14 年前

    这应该能帮到你:

    dirs=(/var/lib/gems/*/bin)    # put filenames (dirnames) in an array
    saveIFS=$IFS IFS=':'          # set the Internal Field Separator to the desired delimiter
    dirs=("${dirs[*]}")           # convert the array to a scalar with the new delimiter
    IFS=$saveIFS                  # restore IFS
    
        3
  •  5
  •   timo    14 年前
    PATH="$(printf "%s:" /usr/*/bin)"
    PATH="${PATH%:}"
    
        4
  •  3
  •   Kevin    5 年前

    IFS ,zsh可以使用一个简单的变量标志连接数组:

    dirs=(/var/lib/gems/*/bin(N))
    dirs=${(j.:.)dirs}
    

    这个 (N) 如果没有文件,则在第一行取消显示警告;这个 (j.:.) 将数组与 :

        5
  •  2
  •   ghostdog74    14 年前
    printf "%s\n" /var/lib/gems/*/bin | tr "\n" ":"
    
        6
  •  2
  •   Sean    14 年前

    如果您使用Perl,这是非常简单的:

    perl -e 'print join ":", @ARGV' /var/lib/gems/*/bin
    

    或Python:

    python -c 'import sys; print ":".join(sys.argv[1:])' /var/lib/gems/*/bin
    

        7
  •  2
  •   pal    5 年前

    不保存IFS和命令替换

    dirs=(/var/lib/gems/*/bin) ; IFS=: eval 'dirs="${dirs[*]}"'
    
        8
  •  0
  •   domen    7 年前

    另一条航线: printf "%s\n" /var/lib/gems/*/bin | paste -s -d':'

    但我认为@timo的答案更好。