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

时间:2009-02-17 11:00:58

标签: scripting tcl expect

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

spawn /bin/mv *.status some_dir
exec /bin/mv *.status some_dir

当然,这不起作用。我google了一下,发现了一些关于glob的东西,但它似乎不像我想要的那样工作。如果我这样做:

exec /bin/mv [glob *.status] somedir

mv 抱怨'1.status 2.status 3.status ......等等'。不是有效的文件。就好像整个文件列表在一个字符串中连接而不是单独处理。

试图通过谷歌找到更多信息引导我到很多破碎和过时的链接,所以我希望在解决这个问题的同时,你能指点我一些好的在线资源来获取tcl / expect基础知识和常见的陷阱。 / p>

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

5 个答案:

答案 0 :(得分:5)

兰迪的回答简短而正确,但不需要使用执行官。 约瑟夫的回答非常强大,但有点长。

对于我将使用的简短且惯用的答案(需要Tcl 8.5):

文件重命名{*} [glob * .status] some_dir

答案 1 :(得分:2)

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/

答案 2 :(得分:1)

$ 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

答案 3 :(得分:0)

当存在大量文件等时,此解决方案适用于名称包含空格的文件:

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

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

答案 4 :(得分:0)

作为一种安全功能,当使用复杂的“查找”命令并可能删除数据时,我会在命令前面贴上“echo”并将其捕获到文件中。
然后,我可以在使用“source”运行它之前检查文件中列出的命令。

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