是否有内联bash脚本这样的东西?

时间:2012-07-02 14:27:29

标签: bash shell

我想在以下方面做点什么:

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

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

5 个答案:

答案 0 :(得分:5)

此特定命令不是一个很好的示例,但您可以通过将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方法相比,上面的命令很复杂且很慢。我发布它只是为了显示一些很酷的语法。

答案 1 :(得分:4)

这里不需要xargs

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

答案 2 :(得分:0)

我不确定你的for循环的语义应该是什么,但盲目地编码它会得到这样的东西:

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

如果在多个地方使用正文,您也可以使用bash函数。

答案 3 :(得分:0)

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

Star *必须转义

您可以尝试使用echo命令来确定将执行的命令

find . -name '*.mk' -print0 | xargs -0i sh -c "echo mv '{}' '{}.aside'" 
man xargs
/-i
man sh
/-c

答案 4 :(得分:0)

我确信你能以一种很好的方式做到这一点,但是因为你要求xargs:

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

循环使用文件名没有意义,因为您一次只能重命名一个。使用内联丑陋不是必需的,但我无法使用管道evalbash -c