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

Ara*_*rav 1 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 $?");
Run Code Online (Sandbox Code Playgroud)

小智 16

您正在寻找的功能是在File :: Copy中:

use File::Copy 'move';
move $x, $y or WriteLog ("move $x, $y failed: $!");
Run Code Online (Sandbox Code Playgroud)

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

你当然可以使用system ("mv ...")命令来做同样的事情.File :: Copy的优点是:

  • 它可以在不同的操作系统上运行,如果你正在为其他人写一些东西,这可能是必要的;
  • 由于将数据传递给shell或者可移植性错误,它不会将您暴露给安全漏洞,因为文件路径中包含元字符和空格,如/Library/Application Support/Hi I'm On A Mac/;
  • 它更快:看到Schwern的粘贴.system其他一切沼泽的成本.File::Copy::move并且rename具有相同的成本,因此您可以使用move跨文件系统工作的更安全.

  • 另一个优点是,由于将数据传递给shell,它不会使您暴露于安全漏洞.或者是可移植性错误,因为文件路径中有元字符和空格,如`/ Library/Application Support/Hi我在Mac上/` (3认同)

Eth*_*her 8

这里还有一件事要添加到混合中 - 如果你在同一个设备中移动文件(也就是说,不需要移动文件内容,只更新其目录条目),你可以简单地使用内置函数 重命名:

重命名OLDNAME,NEWNAME

更改文件的名称; 现有文件NEWNAME将被破坏.成功时返回true,否则返回false.

此功能的行为根据您的系统实施而有很大差异.例如,它通常不能跨文件系统边界工作,即使系统mv命令有时会补偿这一点.其他限制包括它是否适用于目录,打开文件或预先存在的文件.有关详细信息,请检查perlport以及rename(2)联机帮助页或等效的系统文档.

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