2014-02-27 50 views
1

我試圖找到一種方法將所有* .exe文件(以及更多,* .dtd,* .obj等)從目錄結構複製到另一個路徑。從目錄樹中遞歸複製文件類型

比如我可能有:

Code 
    \classdirA 
      \bin 
       \classA.exe 
    \classdirB 
      \bin 
       \classB.exe 
    \classdirC 
      \bin 
       \classC.exe 
    \classdirD 
      \bin 
       \classD.exe 

,我想所有的* .exe文件複製到一個單獨的目錄,說c:\bins 什麼是做到這一點的最好方法是什麼?

約束我的系統是:

  • 的Windows
  • 可以是Perl中,紅寶石,或.cmd

任何人都知道我應該尋找在這裏?

+2

當您詢問代碼時,我們希望您向我們展示您嘗試的內容。否則,看起來你正在爲別人爲你做這項工作而沒有付出任何努力。 –

+1

我會使用Ruby的[Find](http://www.ruby-doc.org/stdlib-2.1.1/libdoc/find/rdoc/index.html)類,它可以遞歸地下降到一個目錄來查找文件/符合您的標準的目錄。此時,您可以使用['FileUtils.cp']輕鬆複製文件(http://www.ruby-doc.org/stdlib-2.1.1/libdoc/fileutils/rdoc/FileUtils.html#method-c- CP)。兩個文檔都有示例顯示如何使用它們。 –

+0

@the,我相信[this](http://ruby-doc.org/stdlib-2.1.0/libdoc/find/rdoc/Find.html)是Find模塊的直接鏈接。 –

回答

5

只要做到在Ruby中,使用方法Dir::glob

# this will give you all the ".exe" files recursively from the directory "Code". 
Dir.glob("c:/Code/**/*.exe") 

** - 遞歸匹配所有目錄。這用於下降到目錄樹中,並查找當前目錄的子目錄中的所有文件,而不僅僅是當前目錄中的文件。示例代碼探討了此通配符。

* - 匹配零個或多個字符。只包含星號且不包含其他字符或通配符的glob將匹配當前目錄中的所有文件。星號通常與文件擴展名組合,如果不是更多字符則縮小搜索範圍。

好博客Using Glob with Directories

我們複製文件到你需要的目錄,你需要尋找到方法,FileUtils.cp_r

require 'fileutils' 
FileUtils.cp_r Dir.glob("c:/Code/**/*.exe"), "c:\\bins" 

我剛剛測試過,那FileUtils.cp方法也將工作,在這種情況下:

require 'fileutils' 
FileUtils.cp Dir.glob("c:/Code/**/*.exe"), "c:\\bins" 

我在這裏偏好使用::cp方法。因爲Dir::glob實際上是遞歸地收集擴展名爲.exe的所有文件,並將它們作爲數組返回。現在cp方法就夠了,現在只需從陣列中取出每個文件並將其應用到目標文件

爲什麼我不喜歡這種情況下,方法::cp_r

好的,讓我在這裏解釋一下。如方法名稱暗示,它將全部文件遞歸地從目標目錄。如果需要遞歸複製特定文件,那麼::cp_r將無法​​通過自己的力量來執行此操作(因爲它本身不能進行選擇,而::glob可以執行此操作)。因此,在這種情況下,您必須爲其指定特定的文件列表,然後將其複製到目標目錄。如果這是唯一的任務,我必須這樣做,那麼我認爲我們應該使用::cp,而不是::cp_r

希望我的解釋有幫助。

+1

我喜歡你的解決方案的一件事是,它可以用於任何操作系統,因爲特定於Windows的部分被分配給兩個字符串。 –

2

cmd命令行

for /r "c:\code" %f in (*.exe) do copy "%~ff" "c:\bins" 

對於一個批處理文件內使用,雙百分號(的%%代替%

+0

這是* perl *嗎? –

+0

@ArupRakshit,不,Windows shell('cmd')命令, – ikegami

+0

好的......對不起......作爲多語言標記,它......更好的是上面提到的,在哪個平臺上使用。順便說一句,你可以給上述文件鏈接? –

1

Windows外殼(cmd)命令:

for /r code %q in (*.exe) do copy "%q" c:\bin 

如果將其放在批處理文件中,請將%個字符加倍。