【问题标题】:Passing multiple commands through xargs通过 xargs 传递多个命令
【发布时间】:2016-03-06 07:25:45
【问题描述】:

我有一个包含多个 bash 命令的文本文件。一个类似的例子就是这样

commands.txt ->

mkdir test
rm test '\t'
mkdir test1
rm test1 '\t'
mkdir test3
rm test3 '\t'

我想要做的是从文本文件中获取所有 rm 命令并与 xargs 同时运行它们,一旦完成,获取所有 mkdir 命令并同时运行它们。

我从博客中得到这个想法 -

grep 'rm' commands.txt |读我的时候;做 printf "%q\n" "$i";完成 | xargs --max-procs=3 -I CMD bash -c CMD

这种工作但是在我的命令中我确实有一个'\ t'并且它没有转义它而是只是放了一个 t。我认为这与printf有关。有什么想法吗?

【问题讨论】:

  • 闻起来像XY problem,而且一点都不安全,你可以用这种方式轻松拍摄自己。为什么要这样做?
  • 好吧,文本文件有一堆 hadoop dfs -rmr commands 和 sqoop import commands 。我想先运行 -rmr 命令,然后再运行所有 sqoop 命令 parralell。如果我按顺序执行此操作,则需要很长时间,并且资源无法用于其他还原作业。
  • 脚本写得不好,还是什么?
  • 无论如何,看看 GNU Parallel,它比 xargs 强大得多,应该轻而易举地处理这个问题。看看-j,--max-procs 选项和no command means arguments are commands。您只需要将每组行读入一个单独的数组(使用mapfile 或循环,请参阅BashFAQ/001)。

标签: bash grep multiprocessing cat xargs


【解决方案1】:

这种工作但是在我的命令中我确实有一个 '\t' 和它 不逃避它,而只是放一个t。我认为这必须做 用 printf。

你很亲密;这与read 有关。见Bash Builtin Commands

read……

-r

如果这个 给出选项时,反斜杠不充当转义字符。这 反斜杠被认为是该行的一部分。 …

因此,如果您将read i 更改为read -r i,它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2011-02-12
    • 2012-11-27
    • 2013-09-14
    相关资源
    最近更新 更多