Bash脚本循环遍历子目录并写入文件而不使用find,ls等

时间:2014-10-18 17:52:16

标签: bash shell unix recursion

很抱歉再次提出这个问题。我已经收到了答案,但使用find但不幸的是我需要在不使用任何预定义命令的情况下编写它。

我正在尝试编写一个脚本,它将以递归方式循环遍历当前目录中的子目录。它应检查每个目录中的文件计数。如果文件计数大于10,它应该在名为“BigList”的文件中写入这些文件的所有名称,否则它应该写入文件“ShortList”。这应该是:

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

我的脚本仅在子目录不包含子目录时才有效。 我对此感到困惑,因为它不能像我期望的那样工作。 这是我的剧本

#!/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

如何修改脚本以生成所需的输出?

1 个答案:

答案 0 :(得分:0)

此bash脚本生成所需的输出:

#!/bin/bash

bigfile="$PWD/BigList"
shortfile="$PWD/ShortList"
shopt -s nullglob

loop_folder_recurse() {
    ( 
        [[ -n "$1" ]] && cd "$1"
        for i in */; do
            [[ -d "$i" ]] && loop_folder_recurse "$i"
            count=0
            files=''
            for j in *; do
                if [[ -f "$j" ]]; then          
                    files+="$j"$'\n'
                    ((++count))
                fi
            done
            if ((count > 10)); then 
                outfile="$bigfile"
            else 
                outfile="$shortfile"
            fi
            echo "$i" >> "$outfile"
            echo "$files" >> "$outfile"
        done
    )
}

loop_folder_recurse

解释

使用

shopt -s nullglob,以便当目录为空时,循环不会运行。函数的主体在( )内,因此它在子shell中运行。这是为了方便,因为这意味着当子shell退出时函数返回到上一个目录。

希望脚本的其余部分是相当不言自明的,但如果没有,请告诉我,我很乐意提供其他解释。