2014-10-18 84 views
1

我不知道我花了很多小时来处理这个问题。我需要写脚本。脚本应该递归地循环通过当前目录中的子目录。它应该检查每个目录中的文件计数。如果文件数量大于10,它应该在名为“BigList”的文件中写入这些文件的所有名称,否则应该写入文件“ShortList”。这应该看起来像Bash脚本通过子目录循环并写入文件

---<directory name> 
<filename> 
<filename> 
<filename> 
<filename> 
.... 
---<directory name> 
<filename> 
<filename> 
<filename> 
<filename> 
.... 

我的脚本只有在子目录轮流不包含子目录时才有效。 我对此感到困惑。因为它不像我所期望的那样工作。这将花费不到5分钟的时间在我的任何编程语言上编写。 请帮忙解决这个问题,因为我不知道该怎么做。 这里是我的脚本

#!/bin/bash 
parent_dir="" 
if [ -d "$1" ]; then 
    path=$1; 
else 
    path=$(pwd) 
fi 
parent_dir=$path 
loop_folder_recurse() { 
    local files_list=""  
    local cnt=0 
    for i in "$1"/*;do 
     if [ -d "$i" ];then 
      echo "dir: $i" 
      parent_dir=$i    
      echo before recursion 
      loop_folder_recurse "$i" 
      echo after recursion 
      if [ $cnt -ge 10 ]; then 
       echo -e "---"$parent_dir >> BigList 
       echo -e $file_list >> BigList 
      else 
       echo -e "---"$parent_dir >> ShortList 
       echo -e $file_list >> ShortList 
      fi 
     elif [ -f "$i" ]; then 
      echo file $i 
      if [ $cur_fol != $main_pwd ]; then 
       file_list+=$i'\n' 
       cnt=$((cnt + 1)) 
      fi 
     fi 
    done 
} 
echo "Base path: $path" 
loop_folder_recurse $path 
+2

您的代码缩进难以理解且难以理解。 – 2014-10-18 06:00:38

+0

对不起,请帮助做到这一点,而不使用找到 – ketazafor 2014-10-18 06:38:31

回答

1

我相信这你想要做什么:

find . -type d -exec env d={} bash -c 'out=Shortlist; [ $(ls "$d" | wc -l) -ge 10 ] && out=Biglist; { echo "--$d"; ls "$d"; echo; } >>"$out"' ';' 

如果我们不想要么算子目录截止或将它们列在输出,然后使用此版本:

find . -type d -exec env d={} bash -c 'out=Shortlist; [ $(ls -p "$d" | grep -v "/$" | wc -l) -ge 10 ] && out=Biglist; { echo "--$d"; ls -p "$d"; echo; } | grep -v "/$" >>"$out"' ';' 
+0

感谢您的答案,但是有可能没有调用查找。 – ketazafor 2014-10-18 06:35:24

+0

@ketaza是的,但'find'是这份工作的正确工具。 – John1024 2014-10-18 06:42:08

+0

如何在没有目录的文件中只写入文件? – ketazafor 2014-10-18 07:08:51