Scripting 如何重命名/移动具有特定扩展名的所有文件?
我正在学习tcl(expect),现在我遇到了一个有趣的问题。我需要一个命令来移动/重命名一堆扩展名为.status的文件。我试过这些: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
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,问题仍然存在。