什么是'mv'系统命令的Perl等价物?

时间:2010-07-07 01:46:55

标签: perl

我有以下“系统命令”来移动文件。使用File::Move命令或使用下面的命令是否合适?如果File::Move更好,我该如何使用它?

system("mv $LOGPATH/test/work/LOGFILE  $LOGPATH/test/done/$LOGFILE") == 0
  or WriteLog(ERROR, "mv command Failed $LOGPATH/test/work/$LOGFILE  status was $?");

3 个答案:

答案 0 :(得分:15)

您要查找的功能位于File :: Copy:

use File::Copy 'move';
move $x, $y or WriteLog ("move $x, $y failed: $!");

File :: Copy是Perl自身标准发行版的一部分。

您当然可以使用system ("mv ...")命令执行相同的操作。 File :: Copy的优点是:

  • 它可以在不同的操作系统上运行,如果你正在为其他人写一些东西,这可能是必要的;
  • 由于将数据传递给shell或由于文件路径中包含元字符和空格(例如/Library/Application Support/Hi I'm On A Mac/;
  • ),因此不会将您暴露给安全漏洞。
  • 速度更快:见Schwern's pastesystem的成本淹没了其他一切。 File::Copy::moverename的费用大致相同,因此您也可以使用更安全的move,它可以在文件系统中运行。

答案 1 :(得分:8)

如果你要移动文件,还有一件事要添加到混音中 相同的设备(即,不需要仅移动文件内容 更新其目录条目),您可以简单地使用内置函数 rename

  

重命名OLDNAME,NEWNAME

     

更改文件名称;现有文件NEWNAME将是   重挫。成功时返回true,否则返回false。

     

此功能的行为因您而异   系统实施。例如,它通常不起作用   跨文件系统边界,即使系统mv   命令有时会补偿这一点。其他限制   包括它是否适用于目录,打开文件或预先   现有文件。检查perlport和重命名(2)   有关详细信息,请参见联机帮助页或等效系统文档。

     

对于独立于平台的“移动”功能,请查看   File::Copy模块。

答案 2 :(得分:3)

要添加Kinopiko的优​​秀答案,使用File :: Copy而不是系统mv命令的两个主要原因之一 - 除了不总是相关但仍然有意义的可移植性问题之外,他指出 - 事实上,调用系统命令会分叉至少一个子进程(如果你做任何重定向,其中两个 - mv和shell)。与File :: Copy相比,这会浪费大量系统资源。