如何复制或移动具有相同扩展名的多个文件?

时间:2018-07-18 19:06:18

标签: tcl

所以我试图将一堆具有类似扩展名的文件从/ home /移到/ root /

我尝试的代码是

file copy /home/*.abc.xyz /root/

也尝试过

set infile [glob -nocomplain /home/*.abc.xyz ]
if { [llength $infile] > 0 } { 
    file copy $infile /root/
}

没有成功。

3 个答案:

答案 0 :(得分:2)

您的两次尝试由于不同的原因而失败:

  1. file copy或任何Tcl命令的参数中没有通配符扩展,例如:file copy /home/*.abc.xyz /root/。这将查找其文件名中带有文字*的单个源。

  2. 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/

代替您的第一次尝试,看看是否有帮助。