3

我想做一些事情:

find -name *.mk | xargs "for i in $@ do mv i i.aside end"

我意识到这可能不仅仅是错误,但我想具体了解这种我可以将 xargs 传递给的内联命令定义。

4

5 回答 5

6

这个特定的命令不是一个很好的例子,但您可以通过sh -c 'here is the script'作为命令给出来使用“内联 shell 脚本”。您可以在脚本中为其提供 $@ 参数,但有一个问题:脚本中的第一个参数在here is the script$0 之后,因此您必须在其中添加一个额外的单词,否则您将丢失第一个参数。

find . -name '*.mk' -exec sh -c 'for i; do mv "$i" "$i.aside"; done' fnord '{}' +

我利用的另一个有趣的功能是 for 循环默认迭代命令行参数:for i; do ...相当于for i in "$@"; do ...

我重申,与执行批量 mv 的许多其他方法相比,上述命令复杂且缓慢。我发布它只是为了展示一些很酷的语法。

于 2012-07-02T15:03:31.680 回答
4

这里不需要 xargs

find -name *.mk -exec mv {} {}.aside \;

于 2012-07-02T14:30:52.967 回答
0

我不确定你的 for 循环的语义应该是什么,但是盲目地编码它会给出这样的结果:

find -name *.mk | while read file
  do
    for i in $file; do mv $i $i.aside; done
  done

如果多处使用body,也可以使用bash函数。

于 2012-07-02T14:33:12.903 回答
0

在某些版本的 find 中需要一个参数:。对于当前目录

星 * 必须转义

您可以尝试使用 echo 命令来确定命令会做什么

find . -name '*.mk' -print0 | xargs -0i sh -c "echo mv '{}' '{}.aside'" 
man xargs
/-i
man sh
/-c
于 2012-07-02T14:49:18.080 回答
0

我敢肯定你可以很好地做到这一点,但既然你要求 xargs:

find -name "*.tk" | xargs -I% mv % %.aside

循环文件名没有意义,因为一次只能重命名一个。没有必要使用内联丑陋,但我无法使其与管道和evalor一起工作bash -c

于 2012-07-02T14:50:04.640 回答