是否有内联bash脚本这样的事情?

问题描述:

我想要做的东西线:是否有内联bash脚本这样的事情?

find -name *.mk | xargs "for i in [email protected] do mv i i.aside end" 

我认识到,有可能比在此错误的更多,但我想具体了解这种内嵌命令定义的,我可以将xargs传递给。

+0

所以你要简单地重命名所有的* .mk文件或其他什么东西? – lynxlynxlynx

+0

你是什么操作系统?至少Linux知道'rename'命令,查看http://linux.die.net/man/1/rename –

+0

你应该记住'find'和'xargs'确实与bash无关,它们是独立的程式。他们不知道(或关心)bash命令。 – cdarke

没有必要在这里xargs的

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

+0

问:“我该如何做X?”。答:“你不需要做X” –

我不知道你的for循环的语义应该是什么样的,但一味地编码它会给这样的:

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

如果身体在多个地方使用,您还可以使用bash功能。

在某些版本找到一个论点需要。当前目录

星*必须进行转义

你可以用echo命令尽量肯定会做什么命令

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

我敢肯定,你可以在一个不错的方式做到这一点,但因为你要求xargs的:

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

循环执行的文件名是没有意义的,因为你只能重新命名一次一个。使用内联uglyness是没有必要的,但我不能使它与管道,要么evalbash -c工作。

这个特殊的命令是不是一个很好的例子,但您可以通过给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 i; do ...相当于for i in "[email protected]"; do ...

我重申,上面的命令是令人费解和慢相比,到许多其他做批量MV的方法。我发布它只是为了显示一些很酷的语法。