将输出放在下一个管道中

时间:2014-02-20 09:24:20

标签: linux bash

我想移动命令的输出:

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 个答案:

答案 0 :(得分:1)

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

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,

答案 1 :(得分:0)

如果您只想获取文件名,

ls有点多余。 你可以把shell搞得那些,然后用printf把它们放到一行。

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

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

impdp sim/sim files=$(printf '%s\n' /${TMP_DIR}/*0000000221*.dbf | paste -d, -s)

答案 2 :(得分:0)

您可以使用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

答案 3 :(得分:0)

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

impdp sim/sim files=$(ls -1 /tmp/*0000000221*.dbf | xargs | sed 's/ /,/g')

答案 4 :(得分:0)

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

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