通过“ xargs”将变量从“ ls”传递到“ tar”


9

我正在尝试做类似的事情

ls -t | head -n 3 | xargs -I {} tar -cf t.tar {}

来归档最后3个修改过的文件,但最终每个文件分别运行tar命令,最后我剩下一个tar文件,其中包含3个文件中的最后一个(按它们的顺序)。我知道我没有正确使用'xargs',但是搜索没有帮助;我发现也不起作用的示例。甚至更简单的命令

ls | xargs -I {} tar -cf t.tar {}

最后以一个tar文件结尾,该文件仅包含该目录中的一个文件。

Answers:


8

ls -t | head -n 3 | xargs tar -cf t.tar

为我工作。您是否需要设置-I标志的原因?


我从来没有尝试过这种方法。非常感谢!但是,如果我真的想通过-I传递它们怎么办?有没有办法正确格式化呢?
oligilo 2015年

如果要使用该-I标志,则应使用其他内容{}代替replacestring。例如ls -t | head -n 3 | xargs -I foo tar -cf t.tar foo
大卫·金

我做到了,但是得到的结果是相同的:只有最后一个文件,或者等效地,它为每个项目分别运行tar命令。
oligilo 2015年

在xargs手册页中进一步阅读之后…… -I意味着-L 1有效地意味着对每1行输入运行以下命令,这就是为什么您看到自己的结果。
大卫·金

啊,我明白了;非常感谢你的帮助; 好几天困扰着我。我真的很感激。
oligilo

0

根据这篇文章,最好使用r代替c,以防xargs砍切输入,从而产生仅包含最后一块的tar文件。因此,更好的解决方案是:

rm -f t.tar 2>/dev/null  # remove tar if there
ls -t | head -n 3 | xargs tar -rf t.tar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.