【问题标题】:How to use bash to show folders that have two subfolders?如何使用 bash 显示具有两个子文件夹的文件夹?
【发布时间】:2013-02-16 16:33:36
【问题描述】:

我通过 Cygwin 使用 bash。我有一个大文件夹 (a),有许多子文件夹 (b)。这些子文件夹各有一个或两个子文件夹 (c)。我想找到所有有两个子文件夹(c)的子文件夹(b)并输出它们。

结构如下:

a
 b1
  c1 
 b2
  c1
  c2
 b3
  c1
  c2

到目前为止,我只知道如何使用find 和管道输出主文件夹 (a) 中的所有子文件夹。

find . -type d > folders.txt

如何仅将具有两个 c 文件夹的所有 b 文件夹输出到每行一个文件夹的文本文件? (在我的例子中,输出应该是:

b2
b3

【问题讨论】:

    标签: bash shell awk


    【解决方案1】:

    尝试使用 执行此操作:

    cd a
    find . -type d |
    awk -F/ '{arr[$2]++}END{for (a in arr) {if (arr[a] == 3) print a}}'
    

    或者使用

    cd a
    for i in */; do x=( $i/*/ ); (( ${#x[@]} == 2 )) && echo "${i%/}"; done
    

    【讨论】:

    • awk 在这里看起来有点多余:for i in `ls`; do if [ 2 -eq `ls $i | wc -l` ]; then echo $i; fi; done :-)
    • @sputnick :好吧,我几年前就这样做了,但在这种情况下我仍然更喜欢使用ls——它使代码更具可读性,尤其是对于新手而言。
    • 非常不好的习惯,尤其是对于新手。 ls 是一个交互式查看文件信息的工具。它的输出是为人类格式化的,并且会导致脚本中的错误。了解原因:mywiki.wooledge.org/ParsingLspartmaps.org/era/unix/award.html#ls
    【解决方案2】:

    有一个更简单的解决方案,它利用父目录从每个子目录链接 .. 的事实将目录的链接计数增加 1。没有子目录的目录的链接计数为 2 (@987654322 @ 以及来自其父级的链接(按其名称)。因此,具有两个子目录的目录的链接计数为 4:

    find . -type d -links 4
    

    对目录进行其他硬链接是不合法的,因此不应出现误报。

    【讨论】:

    • 简单多了,只是缺少问题中子文件夹的显示
    【解决方案3】:

    有一个很棒的开源实用程序可以满足您的需求。它被称为“树”,它有很多有用的选项。它包含在大多数 Linux 发行版中,但您应该能够为 Cygwin 编译。

    您可以在以下位置找到“树”: http://mama.indstate.edu/users/ice/tree/

    您也可以使用 Perl。它会比 Bash shell 脚本更灵活。使用 Perl (http://perldoc.perl.org/File/Find.html) 中的 File::Find 模块,它可以让你轻松地做你想做的事。您的 Cygwin 环境中是否安装了 Perl?你知道 Perl 吗?如果您希望我发布一个 Perl 脚本来执行此操作,请告诉我。

    【讨论】:

      【解决方案4】:

      试试这个 bash 脚本 -

      #!/bin/bash
      
      cd a
      for i in `pwd`/* ; do
        if [ -d "$i" ]; then
          DIR=0;
          cd $i;
          for j in * ; do
          if [ -d "$j" ]; then
          let DIR=DIR+1;
          fi
          done
          if [ $DIR -eq 2 ]; then
          echo $i;
          fi
        fi
      done
      

      假设脚本名称是test.sh,你可以这样做

      $./test.sh > folder.txt
      

      【讨论】:

        猜你喜欢
        • 2020-02-03
        • 1970-01-01
        • 2021-11-26
        • 1970-01-01
        • 2013-10-14
        • 1970-01-01
        • 1970-01-01
        • 2015-03-29
        • 1970-01-01
        相关资源
        最近更新 更多