如何找到深度最浅的目录?

4
如何找到深度最小的目录?以下脚本可以找到深度最小的bb目录,但我认为应该有更好的方法/一行代码?这里它会打印出包含最少数量/的路径。
$ tree
.
├── a
│   └── bb
│       └── c
│           └── d
│               └── bb
├── m
│   └── n
│       └── k
│           └── bb
└── x
    └── y
        └── bb
            └── z

n=100
for f in $(find . -name bb -type d); do
  l=$(echo $f | tr -cd '/' | wc -c)
  if [[ $l -lt $n ]]; then
     n=$l
     shortest_bb=$f
  fi  
done
echo $shortest_bb

也许可以适应 https://unix.stackexchange.com/questions/279895/how-can-i-do-a-breadth-first-search-using-find - tripleee
这与什么有关?sort肯定可以可靠地排序,但它存在可用性问题,当您使用不正确时可能会产生意外的结果。 - tripleee
@tripleee 谢谢,这不是针对你的评论,只是一般性的询问。 - rodee
1
“一般而言”太过笼统,无法得到明确的答案。如果字符排序或编码未受控制,则sort的输出结果可能与预期的不同,或者与其他设置下的结果不同,但正确/健壮的使用方法可以解决这个问题。也就是说,只有当您在使用sort时不知道自己在做什么时,它才是不可靠的。 :) - Charles Duffy
明白了,谢谢@CharlesDuffy - rodee
2个回答

1

“one-liners”中允许换行:

# set up the test directories
mkdir -p a/bb/c/d/bb m/n/k/bb x/y/bb/z

# and find the shortest "bb" path
find . -type d -name bb |
  awk -F/ '{print NF "\t" $0}' |
  sort -k1,1n |
  head -1 |
  cut -f2

./a/bb

0
你可以用一行代码实现这个功能:
find . -type d | awk '{ print gsub(/\//,$0) " " $0 }' | sort -rn

它将在第一列输出深度

   5 /test/test.xcodeproj/xcuserdata/Matias-Barrios.xcuserdatad/xcschemes
   5 ./test/test.xcodeproj/project.xcworkspace/xcuserdata/Matias-Barrios.xcuserdatad
   5 ./TestQueue/TestQueue.xcodeproj/xcuserdata/Matias-Barrios.xcuserdatad/xcschemes
   5 ./TestQueue/TestQueue.xcodeproj/xcuserdata/Matias-Barrios.xcuserdatad/xcdebugger
   4 ./TestQueue/TestQueue/Assets.xcassets/seven.imageset
   4 ./TestQueue/TestQueue/Assets.xcassets/question.imageset
   4 ./TestQueue/TestQueue/Assets.xcassets/poker.imageset

等等。

希望它有所帮助。


为什么您要将深度放在第二列而不是第一列?这样更容易按照第一列进行排序,而且这样您的工具就不会错误地将包含空格和/或数字的文件名中的内容误读为“第二”列(不希望空格后面的部分被读作第二列)。 - Charles Duffy
@CharlesDuffy 您是对的。那个顺序不好。我会纠正它。谢谢。 - Matias Barrios

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