Scripting 如何重命名/移动具有特定扩展名的所有文件?

Scripting 如何重命名/移动具有特定扩展名的所有文件?,scripting,tcl,expect,Scripting,Tcl,Expect,我正在学习tcl(expect),现在我遇到了一个有趣的问题。我需要一个命令来移动/重命名一堆扩展名为.status的文件。我试过这些: spawn /bin/mv *.status some_dir exec /bin/mv *.status some_dir 当然,这是行不通的。我在谷歌上搜索了一下,发现了一些关于glob的东西,但它似乎并没有按照我想要的方式工作。如果我这样做: exec /bin/mv [glob *.status] somedir mv投诉“1.status 2.s

我正在学习tcl(expect),现在我遇到了一个有趣的问题。我需要一个命令来移动/重命名一堆扩展名为.status的文件。我试过这些:

spawn /bin/mv *.status some_dir
exec /bin/mv *.status some_dir
当然,这是行不通的。我在谷歌上搜索了一下,发现了一些关于glob的东西,但它似乎并没有按照我想要的方式工作。如果我这样做:

exec /bin/mv [glob *.status] somedir
mv投诉“1.status 2.status 3.status…etc.”不是有效文件。这就好像整个文件列表被连接在一个字符串中,而不是单独处理

试图通过google查找更多信息导致我找到了很多破损和过时的链接,因此我希望除了解决这个问题之外,您能为我指出一些关于tcl/expect基础知识和常见缺陷的好的在线资源

更新:只接受在/bin中使用标准tcl和标准工具的解决方案

$ ls -1 1.status 2.status rename.tclsh* some_dir/ two words.status $ cat rename.tclsh #!/usr/local/bin/tclsh eval exec /bin/mv [glob *.status] some_dir $ ./rename.tclsh $ ls -1 rename.tclsh* some_dir/ $ ls -1 some_dir/ 1.status 2.status two words.status $ls-1 1.地位 2.地位 rename.tclsh* 一些/ 两个字。地位 $cat rename.tclsh #!/usr/local/bin/tclsh eval exec/bin/mv[glob*.status]some_dir $./rename.tclsh $ls-1 rename.tclsh* 一些/ $ls-1一些/ 1.地位 2.地位 两个字。地位
此解决方案适用于名称中包含空格的文件,当文件很多时,等等:

exec find -maxdepth 1 -name *.status -print0 | xargs -0 mv -t some_dir

但是它需要find和xargs,它们通常在/usr/bin中,而不是在/bin中。

当使用复杂的“find”命令并可能删除数据时,我会在命令前面粘贴一个“echo”并将其捕获到文件中。
proc move_to_dir {filenames dirname} {
    foreach filename $filenames {
        file rename $filename [file join $dirname [file tail $filename]]
    }
}
# Example:
move_to_dir [glob -nocomplain *.status] ~/foo/bar/
然后,我可以在使用“源”运行它之前检查文件中列出的命令


这也是一种手动处理那些偶尔出现的边缘案例文件的方法。

Randy的回答简短而正确,但使用exec时无需使用。 约瑟夫的回答非常有力,但有点长

对于一个简短而惯用的答案,我将使用(需要Tcl 8.5):


文件重命名{*}[glob*.status]某些目录看起来很棒。你介意向tcl新手解释一下为什么这里需要[list exec/bin/mv]吗?实际上我认为这部分是多余的。已编辑。无需执行外部程序即可执行此操作。Tcl具有强大的文件处理命令。当然,如果exec能够工作并允许您继续执行其他任务,那就太好了。对于后来无意中提到这个问题的人,重要的是要指出,你可以通过跨平台的方式来实现这一点,而不必求助于exec。我认为调用什么不如如何调用它重要。用任意命令替换mv,问题仍然存在。