2014-10-18 101 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