2016-08-14 67 views
1

我想递归列出HOME目录中的文件。我试图写我自己的脚本,所以我不应该使用命令findls。我的脚本是:bash中大于100K的列表文件

#!/bin/bash 

minSize=102400; 

printFiles() { 
    for x in "$1/"*; do 
     if [ -d "$x" ]; then 
      printFiles "$x"; 
     else 
      size=$(wc -c "$x"); 
      if [[ "$size" -gt "$minSize" ]]; then 
       echo "$size"; 
      fi 
     fi 
    done 
} 

printFiles "/~"; 

所以,这里的问题是,当我运行此脚本,终端抛出Line 11: division by 0/home/gandalf/Videos/*: No such file or directory。我没有分任何数字,为什么我得到这个错误?而第二个?

或者,我不能使用findls,因为我必须一个一个地向用户显示文件,如果他想查看下一个文件。这是可能的使用命令findls或只能写我自己的功能?

谢谢。

+0

' “/〜”'是_literal_'/〜',因为波浪线扩展只发生在_unquoted_字符串,但即使不带引号'/〜'将无法工作,因为'〜'必须_开始_字符串才能扩展到主目录。 – mklement0

+0

因此用“/ home”替换“/〜”会起作用吗? –

+0

对于您的替代方案,您可以使用'find ... -print |同时读f;做...(逻辑在这里)...;完成'或(bash特定)'读取f;做...(逻辑在这里)...;完成<

回答

2
size=$(wc -c "$x"); 

这就是失败的路线。当您运行wc命令手动你应该能够明白为什么:

$ wc -c /tmp/out 
5 /tmp/out 

输出不仅包含了文件大小,但也文件名。所以你不能在下一行使用$size-gt比较器。解决这个问题的一种方法是将wc行更改为使用cut(或awksed等)以仅保留文件大小。

size=$(wc -c "$x" | cut -f1 -d " ") 

一个简单的替代方法通过@ mklement0建议:

size=$(wc -c < "$x") 
+1

@ mklement0谢谢我已经添加了这个建议。 – kaylum

相关问题