更改xargs参数以包含每个参数的标志的方法?

时间:2014-06-10 13:31:00

标签: bash command-line grep xargs

我对xargs有一些经验,但我不太清楚如何做到这一点:

  • 我有一个使用tarsnap --list-archives
  • 从tarsnap检索到的档案列表
  • 我想删除某一天的所有档案(每天有24份)

我可以使用xargs来实现这个目标:

tarsnap --list-archives | grep 2014-06-09 | xargs -n 1 tarsnap -df

然而,这会一次又一次地使用一个参数(预期)运行tarsnap:

tarsnap -df 2014-06-09-00
tarsnap -df 2014-06-09-01
tarsnap -df 2014-06-09-02
... etc ...

tarsnap文档声明您可以通过传入多个-f标记来删除多个存档:

tarsnap -d -f 2014-06-09-00 -f 2014-06-09-01 -f 2014-06-09-02 # ... and so on

有没有办法用xargs来实现这个目标?

(旁白:即使这样做也许毫无意义,因为我感觉有多个-f标志运行tarsnap只会导致tarsnap多次运行,一次一个参数...但我可以是错的)

4 个答案:

答案 0 :(得分:3)

您实际上可以使用xargs

执行此操作
$ archivelist=$(tarsnap --list-a|xargs -I {} echo "-f {} ")
$ echo $archivelist
-f 2014-06-09-00 -f 2014-06-09-01 -f 2014-06-09-02 -f 2014-06-09-03 

答案 1 :(得分:2)

您可以在-f的所有项目之前将sed注入列表:

tarsnap --list-archives | grep 2014-06-09 | sed 's/^/-f /' | xargs tarsnap -d

答案 2 :(得分:2)

使用与@ choroba相似的想法,您可以完全摆脱grep并使用sed代替:

tarsnap --list-archives | sed -n '/2014-06-09/s/^/-f /p' | xargs tarsnap -d

答案 3 :(得分:0)

如果tarsnap不接受空格(即-f2014-06-09),您可以使用GNU Parallel和上下文替换:

tarsnap --list-archives | parallel -Xj1 tarsnap -d -f{}