Perl 什么是与';mv';系统命令?

Perl 什么是与';mv';系统命令?,perl,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 $?"); 您要查找的函数位于File::Copy: us

我有下面的“系统命令”来移动文件。使用
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 $?");

您要查找的函数位于File::Copy:

use File::Copy 'move';
move $x, $y or WriteLog ("move $x, $y failed: $!");
Copy是Perl本身标准发行版的一部分

当然,您可以使用
系统(“mv…”)
命令执行相同的操作。File::Copy的优点是:

  • 它可以跨不同的操作系统工作,如果您正在编写供其他人使用的内容,这可能是必需的
  • 它不会因为将数据传递到shell而使您暴露于安全漏洞中,也不会因为文件路径中包含元字符和空格而使您暴露于可移植性错误中,比如
    /Library/Application Support/Hi I'm On A Mac/
  • 它更快:看。
    系统的成本压倒了其他一切
    File::Copy::move
    rename
    的成本大致相同,因此您最好使用更安全的
    move
    ,它可以跨文件系统工作

除了Kinopiko出色的回答之外,使用File::Copy over the system
mv
命令的两个主要原因之一是调用一个系统命令会导致至少一个子进程的中断,他指出,这并不总是相关的,但仍然是有意义的可移植性问题(如果您执行任何重定向,其中两个是-
mv
和shell)。与File::Copy相比,这浪费了大量的系统资源。

如果您要在其中移动文件,这里还有一件事需要添加 相同的设备(即,不需要移动文件内容,仅 更新其目录条目),您只需使用内置函数即可 :

重命名旧名称,新名称

更改文件名;现有文件名将为NEWNAME clobbered。返回true表示成功,否则返回false

此函数的行为因用户而异 系统实现。例如,它通常不起作用 跨文件系统边界,即使系统 命令有时会对此进行补偿。其他限制 包括它是否适用于目录、打开的文件或预处理文件- 现有文件。请检查perlport和重命名(2) 详细信息,请参阅手册页或同等系统文档

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


我想知道是否有任何关于性能差异的统计数据?如果没有任何数字,我不会在我的答案中添加这些数据,因为结果可能是系统版本实际上更快。如果没有基准测试,这只是猜测。DVK猜测正确,系统的成本将淹没其他一切。
File::Copy::move
重命名
的成本大致相同,因此您也可以使用更安全的
移动
,它可以跨文件系统工作。哦,谢谢,我在回答中添加了这一点。不幸的是,编辑历史记录被后来的tidyup编辑删除。@Schwern-移动和重命名的成本相同,这一事实是否可以归因于以下事实这段代码足够聪明,可以在可能的情况下执行底层文件系统重命名,就像Unix的“mv”命令中的代码一样?我必须承认,我太懒了,不愿意在凌晨1点进行检查:)@Schwern-另外,虽然您的实际基准测试方法当然是正确的最终仲裁者,但这是经验法则“分叉的成本大大超过了大多数其他成本“至少在处理正确编码的Perl核心模块时,很少会出现错误。另一个优点是它不会因为将数据传递到shell而使您暴露在安全漏洞中。或可移植性缺陷,因为文件路径中有元字符和空格,如
/Library/Application Support/Hi我在Mac上/
+1代表Kinopiko,+1代表Schwern,代表一个好的文件名(更不用说正确的点)
使用file::Copy'mv';mv…
以保留权限。