Ruby:FileUtils.cp截断文件;它没有FileUtils.mv吗?

时间:2011-06-23 19:24:57

标签: ruby shell file-io truncation

这很奇怪......我无法弄清楚为什么它会这样做。

  1. 我有一个包含各种CoffeeScript,SASS,HTML和XML文件的文件夹。
  2. 我有一个 Ruby脚本,它们将它们全部收集起来,编译它们,并将它们缩小为一个主XML文件(用于iGoogle Gadget开发)。
    • 此脚本使用trollop获取命令行参数(我只是说明了以下代码)。
  3. 我希望此脚本将此文件从创建它的当前目录复制到将运行它的目标目录。
  4. 到目前为止,构建/编译/缩小步骤就像魔法一样。这是#3,它被暮光之城区域所吸引。

    #!/usr/bin/ruby
    …
    if opts[:deploy_local]
      FileUtils.cp 'build.xml', '/path/to/destination/'
      puts "Copied #{written_file_name} to #{output_destination}." if opts[:verbose]
    end
    

    当复制文件时,目标文件将被截断大约3/4。源文件很好。但是,出于某些奇怪的原因,移动文件就像魅力一样

      FileUtils.mv 'build.xml', '/path/to/destination/'
    

    要添加另一层次的怪异,如果我只是进行系统复制,它也会被截断。

      system("cp build.xml /path/to/destination")
    

    FWIW,我是从zsh开始运行此脚本而不是bash。在这两种情况下(复制和移动),源文件和目标文件都没有被任何其他进程使用。

    有人可以解释这种怪异的行为吗?

1 个答案:

答案 0 :(得分:3)

一些事情:

  • 您是否正在转移到相同的磁盘卷?如果是这样,那么,是的,cam关于原子性的评论肯定是正确的;操作系统可能只是在移动过程中弄乱了inode表,而不是写出数据。如果你在卷之间移动数据,那就不会那么简单了。

  • 您是否尝试过传递

    :verbose => true
    

    到FileUtils.cp命令?这可能会对失败做出诊断。