所以我试图将一堆具有类似扩展名的文件从/ home /移到/ root /
我尝试的代码是
file copy /home/*.abc.xyz /root/
也尝试过
set infile [glob -nocomplain /home/*.abc.xyz ]
if { [llength $infile] > 0 } {
file copy $infile /root/
}
没有成功。
答案 0 :(得分:2)
您的两次尝试由于不同的原因而失败:
file copy
或任何Tcl命令的参数中没有通配符扩展,例如:file copy /home/*.abc.xyz /root/
。这将查找其文件名中带有文字*的单个源。
glob -nocomplain /home/*.abc.xyz
可以收集源,但是glob
返回源列表。 file copy
要求将每个源作为一个单独的参数传递,而不是一个参数。要将源文件的单个集合值扩展为多个单独的参数,请使用Tcl扩展运算符{*}
因此:
set infiles [glob -nocomplain *.tcl]
if {[llength $infiles]} {
file copy {*}$infiles /tmp/tgt/
}
答案 1 :(得分:1)
对于1行答案:
file copy {*}[glob /home/*.abc.xyz] /root/.
答案 2 :(得分:0)
file copy
(和file rename
)命令有两种形式(因此在注释中引用了手册页)。第一种形式将单个文件复制到新目标。第二种形式将所有文件名参数复制到新目录,该命令形式坚持将目录名作为最后一个参数,并且前面可能有任意数量的源文件名。另外,file copy
不会对其参数进行全局扩展,因此,如您所料,您还需要使用glob
命令来获取要复制的文件列表。问题是glob
命令返回文件名列表,而您将该列表作为单个参数传递,即
file copy $infile /root/
将列表作为单个参数传递,因此file copy
命令认为它正在处理第一种形式,并尝试查找名称与整个列表名称匹配的文件。该文件可能不存在。将错误消息放在您的问题中将有助于我们确定。
因此,您要做的是获取infile
变量中包含的文件列表,并将其扩展为单独的自变量词。由于这是一种常见情况,因此Tcl提供了一些语法帮助(假设您没有使用某些Tcl的较早版本)。尝试使用以下命令:
file copy {*}$infile /root/
代替您的第一次尝试,看看是否有帮助。