2013-05-11 65 views
0

我需要通過終端或MATLAB獲取文件夾中的所有.html文件,但問題在於這些.html文件沒有.html擴展名明確在文件中。在這種情況下,我也試圖捕獲.IGF文件,但沒有明確的擴展名。通過沒有明確擴展名的終端獲取目錄中的所有html文件

我寫了一個腳本,可以在MATLAB中做到這一點,調用unix函數基本上循環文件夾中的所有文件,讀取它們並獲取它們的擴展名,最後從文件夾中刪除它們。

我的代碼成功地做到了,但它需要很長時間(大概一個小時)。文件夾中有大約12000個文件,但我正在尋找一些更具時間效率的東西,儘管尺寸很大。我確信終端中有兩三行的捷徑。

close all; clear all; 

Z=dir('./'); 
file_number=length(Z)-2; 

stats=[]; 
stats2=[]; 

for i=1:file_number 
    file_name=Z(i+2).name; 
    command=['cat ' file_name ' | grep GIF']; 
    stats=~unix(command); 
    command2=['cat ' file_name ' | grep html']; 
    stats2=~unix(command2); 

    if stats==1 || stats2==1 
     command3=['rm ' file_name]; 
     unix(command3); 
    end 

    if rem(i,100)==0 
     disp(i); 
    end 
end 

另一個重要的細節: 我的文件沒有在他們的名字的.html或.gif。我知道他們有這種類型,因爲他們的幻數(通過右鍵單擊並查看文件屬性)。我的文件名稱是「1」,「2」,...,「7」,...「11498」。他們理想的是「1.html」,「2.gif」,「3.jpg」等,但他們不是。

+0

現在你正在尋找包含'html'作爲.html文件的文件。那是你想要做的嗎?檢查MIME類型怎麼辦? – Mateusz 2013-05-11 21:35:06

回答

0

好吧,我得到的魔術棒:

grep -r -l -E "GIF|html" . | xargs rm 

的作品就像一個魅力。 (僅用了3分鐘的電腦)。

1

也許你可以在一個單一的一個將二者結合起來的grep命令:

grep -E "GIF|html" file_name 

此外,關於GIF文件,我認爲有可能避免拷貝整個文件,因爲實際需要前三個字節。

+0

這可能會有幫助,你知道我怎樣才能將我的matlab代碼完全轉換爲shell腳本嗎?也許這樣更快。 – Arturo 2013-05-11 22:21:40

0

現在,我無法檢查它在Linux,但這裏是我的代碼(對於bash):

% HTML part 
command=['for f in ./*; do if grep -q "<html>" "$f"; then printf "$f\n" >> html_files; fi; done']; 
stats=~unix(command); 
% GIF part 
command2=['for f in ./*; do first_bytes=$(head -c 3 $f); if [ "$first_bytes" == "GIF" ]; then printf "$f\n" >> gif_files; fi; done']; 
stats2=~unix(command); 

對於GIF文件,前3個字節應爲 「GIF」。對於html文件,它可能必須包含< html>。這些將創建2個文件(gif_files,html_files),分別包含GIF和HTML文件的所需文件名。所有你需要做的是textscan(或textread)這兩個文件來獲取文件名。我想這種方法會更快,因爲控制停留在bash shell而不是ping到shell並返回到MATLAB 20k +次!

注意!確保gif_files和html_files不存在(或者至少它們是空白的),否則你可能會讀取重複的數據。

相關問題