【问题标题】:If running cp in a perl script will files that exist be overwritten?如果在 perl 脚本中运行 cp 会覆盖存在的文件吗?
【发布时间】:2011-07-28 13:53:06
【问题描述】:

我有一个程序可以为 png 图像生成像素强度值,并且由于原始生成的文本文件出现一些故障,这些图像通常必须用同名的新文件覆盖。我的问题是,当我复制该文件的新版本时,目标目录是否必须先删除同名的目标文件,还是会覆盖目标文件?

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

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

【问题讨论】:

  • 你为什么要使用 system() 调用 perl 可以通过内置函数 (unlink) 和标准模块 (File::Copy) 完成的事情?您最终只会牺牲便携性性能。
  • 嗨 Wooble,1 我是 perl 新手,2 可移植性不是问题,因为它所使用的程序不会分发到任何其他系统上,因为它只在内部使用。 3 性能也不是问题,因为我们对程序当前的性能感到满意,而且这些调用并没有增加太多的运行时间。但是,我将从现在开始使用这种方法。谢谢你,Wooble

标签: linux perl cp rm


【解决方案1】:

执行命令的不是 Perl,而是 Perl 以给定字符串作为参数调用的 shell。

是的,它就像任何普通副本一样——它会破坏任何现有的同名文件,就像你自己将它输入到 shell 中一样,并且会因权限错误等而失败,就像你会自己输入到 shell 中。

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      正如 cmets 中提到的,使用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 $!;
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          • 1970-01-01
          • 2011-06-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多