如何使用bash显示具有两个子文件夹的文件夹?

时间:2013-02-16 16:33:37

标签: bash shell awk

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

结构如下:

a
 b1
  c1 
 b2
  c1
  c2
 b3
  c1
  c2

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

find . -type d > folders.txt

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

b2
b3

4 个答案:

答案 0 :(得分:4)

尝试使用执行此操作:

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

答案 1 :(得分:3)

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

find . -type d -links 4

对目录进行其他硬链接是不合法的,所以不应该有误报。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

试试这个 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