2017-06-12 53 views
1

特定的文件,我想編寫一個Ruby腳本會發現,如果從同一個模式的目錄,然後將文件夾和文件複製到裏面另一個目錄。如何獲得在模式匹配的目錄紅寶石

例如,如果我想找到目錄的模式是:

「./file/drive_Temp/**/tools/」

它可以是:

  • ./file/drive_Temp/abc/tools/
  • ./file/drive_Temp/def/tools/
  • ./file/drive_Temp/xyz/tools/

只要前部以「./file/drive_Temp/」開頭並以「/ tools /」結尾即可。


我想要做的就是複製所有提到一個新的目錄符合目錄的模式中的文件:

有可能是在下面的目錄中的一些文件,如:

  • ./file/drive_Temp/abc/tools/aaa.txt
  • ./file/drive_Temp/abc/tools/bbb.txt
  • ./file/drive_Temp/abc/tools/ccc.txt
  • ./file/drive_Temp/def/tools/zzz.txt
  • ./file/drive_Temp/def/tools/yyy.txt
  • ./file/drive_Temp/def/tools/qqq.txt
  • ./file/drive_Temp/xyz/tools/ttt.txt
  • ./file/drive_Temp/xyz/tools/jjj.txt

那些txt文件將移動到目錄中稱爲工具

這是我的代碼:

if File.directory?('./file/drive_Temp/**/tools') 
    FileUtils.mv './file/drive_Temp/**/tools/*.*','./Tools' 
end 

不工作的兩個星號?因爲該文件夾無法移動到指定的目錄。或者我應該用glob代替?

+0

我覺得你的邏輯有點破。即使mv命令要工作,在./file/drive_Temp/abc/下的'tools'目錄的第一個副本之後,該命令將爲./file/drive_Temp/def/發出一個錯誤,作爲'tools'目錄將已經存在。請告訴你想要達到的目標是什麼? – grail

+0

我改變了我的問題。我想檢查文件夾是否存在,然後將目錄中的文件移動到提供的新目錄 – kerrysugu

+0

無需檢查現有文件夾,可以使用Dir並直接抓取與該文件夾匹配的文件模式。檢查發佈的答案。 – Gerry

回答

0

你可以使用Dir獲得這些目錄內的所有文件,並反覆移動的每個這些文件的,是這樣的:

Dir["./file/drive_Temp/**/tools/*"].each do |file| 
    FileUtils.mv(file, './Tools') 
end 

請注意,這將取代已經在./Tools存在的任何文件;如果需要避免這樣的行爲,那麼你就可以檢查是否將已移動的文件存在於.Tools移動它之前,比如:

target_dir = "./Tools" 

Dir["./file/drive_Temp/**/tools/*"].each do |file| 
    if File.exist?("#{target_dir}/#{File.basename(file)}") 
    # Handle file with duplicate name. 
    else 
    FileUtils.mv(file, target_dir) 
    end 
end 
+0

當'/ file'已存在於./Tools中時會發生什麼? – grail

+0

@grail'file'會覆蓋目標目錄中的文件(即'。/ Tools')。 – Gerry

+0

@grail感謝您指出這一點,即使OP沒有明確要求,也是相關信息,應在答案中予以注意和考慮(至少作爲替代方案)。 – Gerry