2017-08-30 86 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分钟)线路检查逻辑。感谢您的意见:)