我想移动命令的输出:
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}
你可能不需要那么多管道。你可以像这样使用它:
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,
如果您只想获取文件名,ls
有点多余。你可以让 shell 来 glop 这些,然后使用 printf 将它们放在每行一个。
要用","而不是""分隔这些项目,可以使用paste
最后,将所有内容放在 $() 中将在子 shell 中执行,并在当前外壳中输出命令的结果。
impdp sim/sim files=$(printf '%sn' /${TMP_DIR}/*0000000221*.dbf | paste -d, -s)
您可以尝试其他命令顺序:
impdp sim/sim files=$(ls -1 /tmp/*0000000221*.dbf | xargs | sed 's/ /,/g')
您可以使用通配、数组和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
。
(包括我的解决方案在内的所有解决方案都假设您的文件名不包含空格)
sed 有点矫枉过正,你也可以使用 tr 并避免 xargs:
impdp sim/sim files=$(ls /tmp/*0000000221*.dbf | tr "n" ",")