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

将输出放入下一个管道

  •  0
  • Nir  · 技术社区  · 12 年前

    我想移动命令的输出:

    ls -1 /${TMP_DIR}/*0000000221*.dbf | xargs | sed 's/ /,/g'
    

    在后面的命令结尾,像这样:

    ls -1 /${TMP_DIR}/*0000000221*.dbf | xargs | sed 's/ /,/g' | impdp sim/sim files=$1
    

    例如:

    处决 ls -1 /${TMP_DIR}/*0000000221*.dbf | xargs | sed 's/ /,/g' 将给我:

    /tmp/a_0000000221.dbf,/tmp/a_00000002212.dbf,/tmp/b_0000000221.dbf

    所以我希望最后的命令看起来像:

    impdp sim/sim files=/tmp/a_0000000221.dbf,/tmp/a_00000002212.dbf,/tmp/b_0000000221.dbf
    

    编辑: 对不起,我没有从一开始就写这个-我在命令中有变量 ${TMP_DIR}

    5 回复  |  直到 12 年前
        1
  •  1
  •   anubhava    12 年前

    你可能不需要那么多管子。您可以这样使用:

    printf "impdp sim/sim files=" && printf "%s," /tmp/*0000000221*.dbf
    impdp sim/sim files=/tmp/a_0000000221.dbf,/tmp/a_00000002212.dbf,/tmp/b_0000000221.dbf,
    
        2
  •  0
  •   pixelbeat    12 年前

    ls 如果您只想获取文件名,则有点多余。 您可以让shell对这些进行glob处理,然后使用printf每行放置一个。

    要用“,”而不是“\n”分隔这些项目,可以使用 paste

    最后,将所有这些放入$()将在子shell中执行, 并在当前shell中输出命令的结果。

    impdp sim/sim files=$(printf '%s\n' /${TMP_DIR}/*0000000221*.dbf | paste -d, -s)
    
        3
  •  0
  •   Eduardo Yáñez Parareda    12 年前

    您可以尝试其他命令顺序:

    impdp sim/sim files=$(ls -1 /tmp/*0000000221*.dbf | xargs | sed 's/ /,/g')
    
        4
  •  0
  •   Adrian Frühwirth    12 年前

    您可以使用globbing、数组和 IFS 要构造参数字符串,请执行以下操作:

    $ ls -1
    1.txt
    2.txt
    3.txt
    
    $ echo impdp sim/sim files="$(a=(*.txt);IFS=',';echo "${a[*]}")"
    impdp sim/sim files=1.txt,2.txt,3.txt
    

    显然,这将在带有空格或换行符的文件名上中断。

    要运行,只需删除 echo .

        5
  •  0
  •   Walter A    12 年前

    (包括我在内的所有解决方案都假定您的文件名不包含空格)
    sed有点过分,您可以使用tr并避免xargs:

    impdp sim/sim files=$(ls /tmp/*0000000221*.dbf | tr "\n" ",")