2017-08-30 92 views
-1

我有一個工作,爲具有不同名稱的60000+(30.3 GB)文件創建新的硬鏈接。問題是,目錄,舊文件名和新硬鏈接名稱都存儲在一個CSV文件中。現在,我正在編寫一個腳本來自動執行它(解析csv,循環記錄和創建鏈接)。下面是劇本偷偷摸摸加速unix中的硬鏈接創建

while read col1 col2 col3 col4 
do 
     if [ $counter -ne 0 ]; 
     then 
       if [ ! -f "$col2$col3.jpg" ]; then 
         # File not found, need to track how much is not found 
         echo "$col2$col3.jpg" 
         notfound=$(expr $notfound + 1) 
       else 
         if [ $(expr $hash/10) -eq 1 ]; then 
           hash=$(expr $hash - 10) 
         fi 

         ln "$col2$col3.jpg" ./testtemp-1/$hash/$col4.jpg 
         hash=$(expr $hash + 1) 
       fi 
     else 
       counter=$(expr $counter + 1) 
     fi 
done < test.csv 

大約需要15分鐘才能完成這件事。我可否知道是否有任何想法縮短時間?這是一項非常時間敏感的任務,將在生產中完成(現在正在進行測試)。

PS:我需要散列,所以它不能被刪除。未找到也是必需的。 $ col2 - >目錄名稱,$ col3 - >文件名稱,$ col4 - >新的硬鏈接名稱

+1

你是否在爲此而使用Bash?瓶頸可能在磁盤I/O上,但我當然可以看到有些東西可能會在Python或其他一些現代腳本語言中快得多(也更優雅!)。 – tripleee

+3

如果您使用的是Bash,那麼將一個子shell添加到一個數字是非常低效和昂貴的。 Bash有內置的整數運算;你想用'((value ++))'替換'value = $(expr $ value + 1)'' – tripleee

+0

'hash'包含了什麼,它在哪裏定義? – tripleee

回答

0

通過更改expr並跳過第一個,我設法縮短了一個非常合理的時間(2分鐘)線路檢查邏輯。感謝您的意見:)