5

我编写了一个简单的脚本来检查 Dropbox 文件的状态并将其移动到另一个文件夹,如果文件已完全同步和下载(状态 == '最新')。

我现在唯一的问题是,如果文件或目录中有空格,那么我的脚本将无法正确运行。

我曾经#{...}传递文件名,但似乎它会在空格处拆分给它的任何内容。

这是我的脚本:

# runs in Ruby 1.8.x (ftools)                                                                                    

 class DropboxHelper                                                                  

     require 'ftools'                                                                 

     def self.move                                                                    
         directory = "Foo"                                                     
         destination = "Bar"                                                   

         while true                                                                   
             Dir.glob(directory+"/**/*") do |item|                                    
                 next if item == '.' or item == '..'                                  
                 fileStatus = `~/bin/dropbox.py filestatus #{item}`                   
                 puts "processing " + item                                            
                 puts "filestatus: " + fileStatus                                     
                 if (fileStatus.include? "up to date")                                
                     puts item.split('/',2)[1] + " is up to date, starting to move file now."
                     `cp -r #{item + " " + destination + "/" + item.split('/',2)[1]} >> copiedFile.out`

                     # remove file in Dropbox folder, if current item is not a directory and 
                     # copied file is the identical.                                  
                     if (!File.directory?(item) && File.cmp(item, destination + "/" + item.split('/',2)[1]).to_s)
                         puts "remove " + item                                        
                         `rm -rf #{item} >> removedFile.out`                          
                     end                                                              
                 else                                                                 
                     puts item + " is not up to date, moving to next file."           
                 end                                                                  
             end                                                                      

             # execute every hour                                                     
             puts "sleeping now"                                                      
             sleep(3600)                                                              
         end                                                                          
     end                                                                              
 end                                                                                  

 DropboxHelper.move   

运行脚本时,如果文件或目录中有空格,我会得到以下输出。它甚至说文件不是最新的,尽管它是:

Foo/Name with spaces is not up to date, moving to next file.
processing Foo/Name with spaces/file #1.txt
filestatus: Foo/Name: File doesn't exist
with:                 File doesn't exist
spaces/file:          File doesn't exist
Foo/Name with spaces/file #1.txt is not up to date, moving to next file.

任何建议如何改进和修复代码?

4

2 回答 2

6

像这样将所有出现的 o#{item}括在单引号中'#{item}'。例如:

fileStatus = `~/bin/dropbox.py filestatus '#{item}'`

您需要这样做,因为 bash(或您正在使用的任何 shell)以特殊方式解释空格。由于您的文件名本身包含一个空格,因此您需要对其进行转义。另见3.3。引用Bash Guide for Beginners中的字符以获取更多信息。

于 2013-04-10T15:02:45.713 回答
1

您可以使用内置shellescape

fileStatus = `~/bin/dropbox.py filestatus #{item.shellescape}`

http://ruby-doc.org/stdlib-2.3.0/libdoc/shellwords/rdoc/Shellwords.html#method-c-shellescape

于 2016-02-28T16:46:20.623 回答