解压文件输出错误

Untar files outputting error

我最近创建了一个程序,可以解压指定目录中的文件。解压文件时出现错误:

/usr/local/lib/ruby/1.9.1/fileutils.rb:1423:in `stat': No such file or directory - /path/to/directory/file.file (Errno::ENOENT)
        from /usr/local/lib/ruby/1.9.1/fileutils.rb:1423:in `block in fu_each_src_dest'
        from /usr/local/lib/ruby/1.9.1/fileutils.rb:1437:in `fu_each_src_dest0'
        from /usr/local/lib/ruby/1.9.1/fileutils.rb:1421:in `fu_each_src_dest'
        from /usr/local/lib/ruby/1.9.1/fileutils.rb:504:in `mv'
        from spreadsheet:97:in `block in unlock_archive_spreadsheet'
        from spreadsheet:76:in `each'
        from spreadsheet:76:in `unlock_archive_spreadsheet'
        from spreadsheet:24:in `start'
        from spreadsheet:111:in `<main>'

当我尝试 运行 将在其中使用的目录中的程序时,它输出上述错误。
我有点困惑,因为当我测试 运行 这个程序时它起作用了。例如:

[me@me ruby]$ ruby spreadsheet
Is this an archive spreadsheet?: y
Enter Folio # of spreadsheet if unlocking multiple use comma followed by space: 2719569
Text file containing the information is: filelist_20120625.txt
Continue: yes
Preparing to extract file..
Extracting file...
Moving file to 4000_UW_spreadsheets directory
File extracted and moved successfully
[me@me ruby]$ 

这是来源:

 70   require 'fileutils'
 71
 72
 73   def unlock_archive_spreadsheet
 74     print "Enter Folio # of spreadsheet if unlocking multiple use comma followed by space: "
 75     folio = gets.chomp
 76     folio.split(', ').each do |archived_file|
 77        FileUtils.chdir("path/where/file/is")
 78       
 79       archived_text_file = `grep -lr #{archived_file}.ods *.txt`
 80       tar_name = archived_text_file.match(/\d+/).to_s
 81       puts "Text file containing the information is: #{archived_text_file}"
 82       print "Continue: "
 83       continue = gets.chomp.downcase
 84       if continue.start_with?("y")
 85         puts "Preparing to extract file.."
 86        
 87         if File.exist?("/path/to/file/#{archived_file}.ods")
 88           puts "ERROR FILE EXISTS. Delete or move file and try again"
 89           raise "File: #{archived_file}.ods exists in directory. Delete or move file to continue, if file is not found within directory, contact admin."
 90           next
 91         else
 92           puts "Extracting file..."
 93           `tar -xvzf UW_archive_#{tar_name}.tgz path/to/extract/from/#{archived_file}.ods`
 94         end
 95         puts "Moving file to 4000_UW_spreadsheets directory"
 96         
 97         FileUtils.mv "/path/to/file/#{archived_file}.ods", '/path/to/move/to'
 98        
 99         puts "File extracted and moved successfully"
100       else
101         puts "Exiting.."
102         exit 1
103       end
104     end
105   end

我是不是做错了什么?

如果您查看错误消息,就会明白为什么这个操作不起作用。您的代码中仍然有几个占位符路径。错误中明确显示了占位符。

好的,您的问题是以下三件事之一:

  1. 您没有对要移动到的目录的写入权限,我在 我自己的目录 中测试了您的代码,它运行良好,使用起来很好FileUtils,您可以使用 "package/gem" & "zlib" 代替 bash 命令,它看起来像这样: extract = Gem::Package::TarReader.new(Zlib::GzipReader.open(filename_here))
  2. 存档中不存在您的文件,或者存档中有问题。请与管理员或对您要进入的目录具有完全权限的人核实,看看它是否适合他们。
  3. 你的 bash 命令有点奇怪.. tar -xvzf UW_archive_#{tar_name}.tgz path/to/extract/from/#{archived_file}.ods 我不完全确定你在这里试图做什么。但是如果你需要改变目录,并且坚持使用bash,-C就会改变成一个目录。这是对该命令的重写:tar -x -f UW_archive_#{tar_name}.tgz -C /path/to/change/to #{archived_file}.ods

-x告诉bash从tar中提取,-f告诉它这是文件名,-C说把这个文件名提取到这个目录。

这就是我真正能想到的全部,Ruby 几乎可以做 bash 可以做的所有事情,您所要做的就是找到 gem,或者用于它。希望这对您有所帮助!

编辑:

如果从 tarball 内部目录中的大型 tarball 中提取单个文件:tar -x -f tarname.tgz -C path/to/extract/to path/to/file/filename.file

那应该将文件从 tar 中提取出来并放入指定的目录中,不过要小心,这将提取文件和路径,要摆脱你可以使用的路径,--strip-components 1 数字是你要剥离多少条路径。或者您可以从路径中移动文件并删除路径本身,希望这对您有所帮助!