如果在perl脚本中运行cp,是否会覆盖存在的文件?

时间:2011-07-28 13:53:07

标签: linux perl cp rm

我有一个程序会为png图像生成像素强度值,并且由于原始结果文本文件的某些失败,这些图像通常必须被同名的新文件覆盖。我的问题是,当我复制该文件的新版本时,目标目录是否必须首先删除具有相同名称的目标文件,或者目标文件是否会被覆盖?

system ("rm -rf /home/alos/Y2H_images/all$intensity");
system ("cp $intensity /home/alos/Y2H_images/all");

或者在perl脚本中执行copy命令会自动覆盖文件吗?感谢

4 个答案:

答案 0 :(得分:4)

执行命令的不是 Perl ,它是由Perl调用的shell,其中给定的字符串作为参数。

是的,它就像任何正常的副本一样 - 它会破坏任何同名的现有文件,就像你自己在shell中输入它一样,并且在权限错误等方面失败,就好像你是自己输入shell。

此外,通配符扩展和字符串转义是特定于shell的,必须考虑可移植性和安全性的原因。

答案 1 :(得分:3)

您可以简单地复制新文件,旧文件将被替换。

cp允许通过in标志来控制覆盖行为;默认情况下,无论如何,文件都会被覆盖。

如果您想在特定错误条件下保持安全,即无法打开目标文件,您可以指定-f标志:

 system ("cp -f $intensity /home/alos/Y2H_images/all");

答案 2 :(得分:2)

如果你在system中调用它,它就像“现实生活”一样。

答案 3 :(得分:2)

正如评论中所提到的,使用File::Copy确实是更好的解决方案。它将覆盖目标文件(至少在我的系统上)。

use File::Copy;
copy $intensity, "/home/alos/Y2H_images/all" or die $!;

如果您想检查目标文件是否已存在,可以通过以下方式完成:

print "File exists: $intensity\n" if -e $intensity;

如果您仍希望在复制之前删除该文件:

unlink "/home/alos/Y2H_images/all$intensity" or die $!;