我想做一些事情:
find -name *.mk | xargs "for i in $@ do mv i i.aside end"
我意识到这可能不仅仅是错误,但我想具体了解这种我可以将 xargs 传递给的内联命令定义。
这个特定的命令不是一个很好的例子,但您可以通过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 的许多其他方法相比,上述命令复杂且缓慢。我发布它只是为了展示一些很酷的语法。
这里不需要 xargs
find -name *.mk -exec mv {} {}.aside \;
我不确定你的 for 循环的语义应该是什么,但是盲目地编码它会给出这样的结果:
find -name *.mk | while read file
do
for i in $file; do mv $i $i.aside; done
done
如果多处使用body,也可以使用bash函数。
在某些版本的 find 中需要一个参数:。对于当前目录
星 * 必须转义
您可以尝试使用 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
循环文件名没有意义,因为一次只能重命名一个。没有必要使用内联丑陋,但我无法使其与管道和eval
or一起工作bash -c
。