递归函数返回文件树的目录深度

时间:2010-12-01 21:32:05

标签: linux bash

我正在尝试编写一个遍历文件目录的函数,并为我提供最深层目录的值。我已经编写了这个函数,它看起来像是要发送到每个目录,但我的计数器似乎根本不起作用。

dir_depth(){ 

local olddir=$PWD
local dir
local counter=0
cd "$1"


for dir in *
do
  if [ -d "$dir" ]
  then
    dir_depth "$1/$dir"
    echo "$dir"
    counter=$(( $counter + 1 ))
  fi 
done
cd "$olddir"
}

我想要它做的是为函数提供一个目录,例如/ home,它将在每个子目录中找到最深的值。我想更好地学习递归,但我不确定我做错了什么。

6 个答案:

答案 0 :(得分:8)

显然应该找到这个

find . -type d -exec bash -c 'echo $(tr -cd / <<< "$1"|wc -c):$1' -- {} \;  | sort -n | tail -n 1 | awk -F: '{print $1, $2}'

最后我使用awk来打印输出,但是如果那是你想要的输出,那么最好以这种方式回显它。

当然,并不是说它有助于了解递归。

答案 1 :(得分:4)

这是一个非常快的单线:

find . -type d -printf '%d:%p\n' | sort -n | tail -1

或作为一项功能:

depth() 
{ 
  find $1 -type d -printf '%d:%p\n' | sort -n | tail -1
}

答案 2 :(得分:3)

这是一个似乎有用的版本:

#!/bin/sh

dir_depth() {
  cd "$1"
  maxdepth=0
  for d in */.; do
    [ -d "$d" ] || continue
    depth=`dir_depth "$d"`
    maxdepth=$(($depth > $maxdepth ? $depth : $maxdepth))
  done
  echo $((1 + $maxdepth))
}

dir_depth "$@"

答案 3 :(得分:3)

答案 4 :(得分:1)

AIX(6.1)find命令似乎非常有限(例如没有printf选项)。如果您要列出指定深度的所有目录,请尝试finddirname的此组合。将脚本代码保存为maxdepth.ksh。与Linux查找-maxdepth选项相比,AIX find不会停在给定的最大级别,这会导致更长的运行时间,具体取决于扫描的目录的大小/深度:

#!/usr/bin/ksh
# Param 1: maxdepth
# Param 2: Directoryname

max_depth=0
netxt_dir=$2
while [[ "$netxt_dir" != "/" ]] &&  [[ "$netxt_dir" != "." ]]; do
   max_depth=$(($max_depth + 1))
   netxt_dir=$(dirname $netxt_dir)
done

if [ $1 -lt $max_depth ]; then
   ret=1
else
   ret=0
   ls -d $2
fi
exit $ret

示例电话:

find /usr -type d -exec maxdepth.ksh 2 {} \;

答案 5 :(得分:0)

执行此操作的传统方法是让dir_depth也返回最大深度。因此,您将返回名称和深度。

你不能在bash中返回一个数组,结构或对象,所以你可以返回例如逗号分隔的字符串而不是..

dir_depth(){ 
local dir

local max_dir="$1"
local max_depth=0

for dir in $1/*
do
  if [ -d "$dir" ]
  then
    cur_ret=$(dir_depth "$dir")
    cur_depth=$(expr "$cur_ret" : '\([^,]*\)')
    cur_dir=$(expr "$cur_ret" : '.*,\(.*\)')
    if [[ "$cur_depth" -gt "$max_depth" ]]; then
    max_depth="$cur_depth"
    max_dir="$cur_dir"
    fi
  fi
done
max_depth=$(($max_depth + 1))
echo "$max_depth,$max_dir"
}

编辑:现在修复。它从您作为级别1传入的目录开始,然后向上计数。我删除了cd,因为没有必要。请注意,如果文件名包含逗号,则会失败。

您可能需要考虑使用具有更多内置数据结构的编程语言,例如Python。