【问题标题】:Bash script loop through subdirectories and write to fileBash 脚本循环遍历子目录并写入文件
【发布时间】:2014-10-18 05:47:31
【问题描述】:

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

---<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

【问题讨论】:

  • 您的代码的缩进令人费解且难以理解。
  • 很抱歉,请在不使用 find 的情况下帮助执行此操作

标签: bash shell unix sh


【解决方案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"' ';'

【讨论】:

  • 感谢您的回答,但是否可以不调用 find。
  • @ketazafor 是的,但find 是这项工作的正确工具。
  • 如何在没有目录的文件中只写入文件?
  • find ${find_path} -type d -exec env d={} bash -c 'out=Shortlist; [ $(ls -d "$d" | wc -l) -ge 10 ] && out=Biglist; { 回声“--$d”;找到 "$d" -maxdepth 1 -type f;回声; } >>"$out"' ';'
  • @ketazafor 你的运行良好(尽管它仍然在大小计数中包含子目录)我用稍微不同的方法更新了答案。输出格式略有不同,因此您可能更喜欢其中一种。
猜你喜欢
  • 2012-07-25
  • 2013-09-20
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
相关资源
最近更新 更多