我试图使用Tcl移动大量文件,并遇到了表达式:
file rename {*}[glob *tcl] dir/
效果很好。
谁能解释此命令的工作方式或此功能的名称?
答案 0 :(得分:1)
这是两个命令和一些有用的语法的组合。
glob
返回与该模式匹配的文件名的 list ,在您的情况下为*tcl
,如果没有匹配项,则返回错误。您可以使用很多选项来修改返回的内容,但是您不会使用其中任何一个。这对您的用例来说很棒。file rename
将重命名文件或移动文件。特别是,当最后一个参数是现有目录名称时,其他参数是将移入该目录的文件(或目录)。 (如果您熟悉POSIX系统调用的工作方式,那么将其移动是明智的。)难题的最后一部分是{*}[
…]
,即命令扩展,它运行命令(在您的情况下为glob *tcl
)并使用列表中的元素作为返回使用该列表的命令调用的参数序列。哪个有用;我们需要在file rename
调用时的文件名列表。除了诸如内存之类的基本功能外,可以通过这种方式移动的参数数量没有实际限制。
{*}
前缀(仅在单词开头是特殊的)可以与生成Tcl单词的其他格式良好的方式一起使用(例如,使用$
从变量读取或一个带有{…}
的字面量,甚至带有复合词的字面量,尽管与复合词一起使用通常表示您正在做的事情是不明智的。
如果您有旧的Tcl代码(是为Tcl 8.4或更早版本编写的),则不会看到{*}
。相反,您会看到以下内容:
eval file rename [glob *tcl] dir/
# Or, more properly, one of these horrors:
eval {file rename} [glob *tcl] {dir/}
eval [list file rename] [glob *tcl] [list dir/]
eval [linsert [linsert [glob *tcl] 0 file rename] end dir/]
众所周知,在棘手的情况下,这些方法很难正确处理(导致许多细微的错误)。完全在Tcl 8.5中添加了扩展语法,以消除此类麻烦。 eval
在现代Tcl中仍然存在,但值得庆幸的是现在很少使用。