我通过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
答案 0 :(得分:4)
尝试使用awk执行此操作:
cd a
find . -type d |
awk -F/ '{arr[$2]++}END{for (a in arr) {if (arr[a] == 3) print a}}'
或使用bash:
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