让我们只显示最后一项

时间:2016-10-14 12:36:48

标签: bash find

我认为这是一个棘手的问题。

我有一个包含N个递归子目录的目录。 E.g:

/tmp/dir1/dir2
/tmp/dir2
/tmp/dir3/dir4/.../dir7
/tmp/dir4/.../dirN

如果我使用find / tmp,我会得到这样的输出:

/tmp/dir1
/tmp/dir1/dir2
/tmp/dir2
/tmp/dir3
/tmp/dir3/dir4

...

但我只想获得子树中最后一个文件夹的完整路径,而不是单独列出的父目录。

所以在这种情况下:

/tmp/dir1/dir2
/tmp/dir2
/tmp/dir3/dir4

我不能使用mindepth和maxdepth,因为我的子文件夹数量是随机的。

2 个答案:

答案 0 :(得分:3)

您可以使用-links选项过滤掉只有两个链接的目录(一个链接到父级,一个链接到自身),如下所示:

find dir -type d -links 2

目录的links个数被计为每个子目录的链接+指向self的链接+指向父级的链接。后两者总是存在,所以任何目录的链接数都是> = 2.对于没有其他子目录的目录,计数正好是2,这就是你想要的。

答案 1 :(得分:1)

假设find /tmp有此输出:

$ find /tmp
/tmp/dir1
/tmp/dir1/dir2
/tmp/dir2
/tmp/dir3
/tmp/dir3/dir4

您可以添加awk过滤器以仅打印每个类别的最后一行:

$ find /tmp | awk -F/ 'p!=$3&&NR>1{print l}{p=$3;l=$0}END{print l}'
/tmp/dir1/dir2
/tmp/dir2
/tmp/dir3/dir4