iT邦幫忙

1

請教大量條件搜尋大量檔案的方法?

q00153 2016-01-04 10:57:1315494 瀏覽

小弟最近遇到兩件案子,
需求一樣,
就是有上萬個檔案 (容量1X~5XG),
要從裡面篩選出指定條件的檔案,
複製到指定資料夾內,
如果有重複的就用比較新的檔案覆蓋舊的檔案,
篩選條件有上千個,
只要符合的就篩選出來,

因為使用者想用 Excel (輸入篩選條件會比較好用),
所以剛開始小弟是用,VBA 產生 bat 檔去搜尋資料夾,
用 for 迴圈 + copy 指令,
可是太慢了=口=...
重點是,會當機,根本不能使用。

直接用VBA去搜尋也會當掉,
從網路下載的一些用來搜尋的軟體也會當掉...

ㄜ~~請問有前輩遇過這種需求嗎?

大量條件搜尋大量檔案的方法???

看更多先前的討論...收起先前的討論...
aeolus0829 iT邦研究生 4 級 ‧ 2016-01-04 11:28:15 檢舉
不清楚你所謂的 '符合特定條件' 是什麼樣的條件?可否舉具體的例子?
比如說某種副檔名、某個日期

我會選擇用 cygwin 撘配批次檔做這件事
(VBA 還要開一個 office 實體在那邊,一是效能不彰,二是殺雞用牛刀)
fillano iT邦超人 1 級 ‧ 2016-01-04 11:44:33 檢舉
另外一個要問的是:什麼檔?(純文字?程式?圖檔?Excel?Word?)如果你要搜尋的是「檔案內容」的話...
q00153 iT邦新手 3 級 ‧ 2016-01-04 11:46:54 檢舉
符合特定條件==>是指部份檔名或副檔名,由使用者自行設定。
還要開一個 office 是因為使用者想要用 Excel 來設定條件,
所以想說用VBA讀取Excel內設定的條件產生搜尋檔案的程式碼,
再執行該程式,來搜尋檔案。
目前是產生相關的 bat 檔,可是效率不彰。
q00153 iT邦新手 3 級 ‧ 2016-01-04 11:49:30 檢舉
回大大~不用搜尋檔案內容,
只要能搜尋檔案名稱就可以了,
問題是路徑不固定,所以要檔案無論放多深都找的到~
找到檔案後複製到指定的資料夾蒐集起來,不用複製目錄結構,只要該檔案就好,
搜尋的檔案類型不指定,不過以文字跟圖片檔居多~
蟹老闆 iT邦大師 1 級 ‧ 2016-01-04 12:29:37 檢舉
肯定快不了
N千*近萬 怎麼快得了
fillano iT邦超人 1 級 ‧ 2016-01-04 13:59:14 檢舉
建議的做法:分階段,每一階段用不同程式處理
1. 掃出所有檔案,將路徑、檔名、日期等資料存在一個資料檔(資料庫、文字檔、xml、json等都可以,看你習慣處理的格式)
2. 根據篩選條件,篩選過上述資訊,再產生一個資料檔
3. 根據需要的條件,去除上述資料檔中重複的資料,再產生一個資料檔
4. 根據前一步驟的資料檔,產出複製檔案的batch
5. 執行batch檔來把檔案複製到目標
q00153提到:
上萬個檔案 (容量1X~5XG)


Windows 的檔案總管不合用嗎
疑惑
q00153 iT邦新手 3 級 ‧ 2016-01-04 15:05:56 檢舉
因為搜尋條件有上千個(基本是一天是3千多筆)
用檔案總管找 User 應該會死掉
倒
q00153 iT邦新手 3 級 ‧ 2016-01-04 15:11:42 檢舉
謝謝謝謝
感謝大大的建議~
ㄜ~~方便再請教,
第一步掃描所有檔案,用什麼程式語言寫比較快嗎?
因為要這麼多的檔案,如果能將時間壓縮在一個早上(4HR)之內,有可能嗎?
小弟願意學習,只是怕寫出來效能低下,或是當機而已。

不過以前學校學過C/C++,
雖然他是很快的程式語言,
印象中會被中文路徑搞死
搖頭搖頭
這個批次檔可以 cover 部份需求
提供參考看看...

FOR /R C:\ %%f IN (TOKYO*.MP4) DO COPY %%f D:\LOGDATA
FOR /R E:\ %%f IN (*HOT.AVI)   DO COPY %%f D:\LOGDATA
其實治本的方式應該是從「修改那些產生檔案的程式」著手
不過你大概不想這麼做
因為很麻煩
用 VBA 先去 LIST 檔案清單,轉到一張資料表
然後再用 VBA 去資料表找資料,接著再用VBA 去作後續的檔案寫入動作
這樣才是比較快的處理方式,畢竟,你只是要找檔名跟副檔名而已
fillano iT邦超人 1 級 ‧ 2016-01-04 16:03:34 檢舉
我是用node.js...不過建議你還是用你比較熟悉的程式語言/工具來做。我會使用script來做,主要是因為不需要編譯,比較順手...

至於第一步驟的檔案清單,用dir/s/b就可以(不過如果要日期的話,還需要其他欄位,這樣用dir不太容易跑出程式容易處理的清單,也許可以考慮改個方法,先根據日期外的條件過濾,然後才根據清單去找出日期來過濾)
weiclin iT邦高手 4 級 ‧ 2016-01-04 16:17:29 檢舉
+1
只有上萬個檔名而已..
先把檔名整理成一個列表再搜尋, 根本小菜一碟
蟹老闆 iT邦大師 1 級 ‧ 2016-01-04 17:35:24 檢舉
q00153提到:
一個早上(4HR)之內,有可能嗎?

四小時太多了,一個小時以內應該是OK的
小成 iT邦高手 10 級 ‧ 2016-01-05 08:13:13 檢舉
推一下蒐尋軟體,everything
https://www.voidtools.com/
小成 iT邦高手 10 級 ‧ 2016-01-05 08:14:42 檢舉
喔,我看到條件有上千個了,我原本以為只有檔案很多,條件不多...
newkevin iT邦高手 1 級 ‧ 2016-01-05 18:16:56 檢舉
前題
檔案檔名不會增加
這樣才可能吧
應該每天增加的檔名也要+進去吧
蟹老闆 iT邦大師 1 級 ‧ 2016-01-05 23:57:15 檢舉
試試看吧!
因為 forfiles 一次只能搜尋單一條件,所以還是用DIR來進行多條件的效率搜尋應該比較好,本想用FORFILES搭FOR來做檔名與附檔名的條件,但因FORFILES搭FOR不好使,所以只提供了不限附檔名的範例,如還是需要考慮副檔名,可以將 %%?.* 換成 %%?.jpg 或其它,也可以將 %%?.* 換成 %%? 如果換成 %%? 的話必須在條件資料檔中包含副檔名.
@Echo Off
Set Files=1.csv
Set Target=.\test\
If Not Exist %Target% Md %Target%
Echo 開始時間  %Time%  > Timer.txt
For /f "Delims=, Tokens=1-26" %%a In ('Type %Files%') Do (
For /f %%a In ('Dir /b /s %%a.* %%b.* %%c.* %%d.* %%e.* %%f.* %%g.* %%h.* %%i.* %%j.* %%k.* %%l.* %%m.* %%n.* %%o.* %%p.* %%q.* %%q.* %%r.* %%s.* %%t.* %%u.* %%v.* %%w.* %%x.* %%y %%z.*') Do (
Echo 正在處理 %%a
Xcopy /c /d /y "%%a" "%Target%"))
Echo 結束時間  %Time%  >> Timer.txt


這個批次檔須放在要搜尋的目錄最上層,另外會產生一個TEST的資料夾,這裡是要放要複製的檔案
要注意的是條件檔需放在與批次檔同一個目錄中,且需是 .CSV 格式的檔案,每一列最多只能26個(欄)條件,不到26個也可以,但會增加搜尋的時間
可以修改
Files=1.csv 為自訂的名稱
Target=.\test\ 為目標位置
更正預估的時間,因為都小檔,所需的時間可能會更久,但也不至於四個小時.....
我 LIST 10萬個檔名到文字檔,只需要10秒鐘
他只有上萬個,是會需要多久啊
蟹老闆 iT邦大師 1 級 ‧ 2016-01-06 13:14:31 檢舉
jones888提到:
他只有上萬個,是會需要多久啊

還要考慮檔案COPY的時間
蟹老闆 iT邦大師 1 級 ‧ 2016-01-06 13:19:52 檢舉

Dir /b /s 


要改為dir /b /s /a-d

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
8
wiseguy
iT邦超人 1 級 ‧ 2016-01-05 22:07:49
最佳解答

q00153提到:
請問有前輩遇過這種需求嗎?
大量條件搜尋大量檔案的方法???

有。用 Linux 的 find,快又有效。
http://sourceforge.net/projects/unxutils/files/unxutils/current/UnxUtils.zip/download
因為你沒給條件例子,所以我也給不出範例,自己琢磨囉

6
shilong_chang
iT邦新手 5 級 ‧ 2016-01-04 17:33:01

你的問題不是很明瞭,假設是要從D主機copy到E主機,或者是要從D資料夾copy到E資料夾,而且包含所屬的所有子資料夾,這一些資料夾以及檔案裡面全部包含了600萬個檔案,可以簡單的做
Xcopy d:\*.* e:\ /o/s/e/d/c/y
或是 xcopy D:\abc\*.* D:\xyz\ /o/s/e/d/c/y
或是 xcopy d:\abc\*.* \\192.168.1.xx\xyz\ /o/s/e/d/c/y
試試看吧,另外 如果不介意裝個軟體的話 ,請找微軟出的 robocopy 也可以做到一樣的效果

CalvinKuo iT邦大師 7 級 ‧ 2016-01-04 18:03:59 檢舉
0
haoming
iT邦好手 1 級 ‧ 2016-01-07 16:06:01

要不要考慮用 grepWin , 搜尋速度很快。而且支援 regex 要做單純的或者複雜搜尋都沒問題。只是前提要是 文字類型檔案。

wiseguy iT邦超人 1 級 ‧ 2016-01-07 17:49:25 檢舉

q00153提到:
不用搜尋檔案內容,要能搜尋檔案名稱就可以了,

發問者只要找檔名,應該是用不到 grep 這麼強大的武器。

我要發表回答

立即登入回答