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

4
我使用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
4个回答

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

这里使用awk有点多余:for i in \ls`; do if [ 2 -eq `ls $i | wc -l` ]; then echo $i; fi; done` :-) - Aleksei Matiushkin
@sputnick:虽然我几年前尝试过,但在这种情况下我仍然更喜欢使用“ls”——它使代码更易读,特别是对于新手来说。 - Aleksei Matiushkin
1
非常糟糕的习惯,特别是对于新手来说。ls 是一个交互式查看文件信息的工具。它的输出格式适合人类阅读,但会导致脚本中出现错误。请了解原因:http://mywiki.wooledge.org/ParsingLs 和 http://partmaps.org/era/unix/award.html#ls - Gilles Quénot

3

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

find . -type d -links 4

在法律上,制作其他硬链接到一个目录是不合法的,因此不应该出现误报。


更简单,但缺少问题子文件夹的显示。 - coolnodje

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

0

有一个非常棒的开源实用程序可以满足您的需求。它叫做“tree”,并且具有许多有用的选项。它包含在大多数Linux发行版中,但您应该能够为Cygwin编译。

您可以在以下网址找到“tree”: http://mama.indstate.edu/users/ice/tree/

您还可以使用Perl来完成此操作。它比Bash shell脚本更灵活。在Perl中使用File::Find模块(http://perldoc.perl.org/File/Find.html),这将使您轻松地完成所需的操作。您的Cygwin环境中是否安装了Perl?您是否了解Perl?如果需要,让我知道,我可以发布一个Perl脚本来完成此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接