我正在尝试编写一个遍历文件目录的函数,并为我提供最深层目录的值。我已经编写了这个函数,它看起来像是要发送到每个目录,但我的计数器似乎根本不起作用。
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,它将在每个子目录中找到最深的值。我想更好地学习递归,但我不确定我做错了什么。
答案 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选项)。如果您要列出指定深度的所有目录,请尝试find
和dirname
的此组合。将脚本代码保存为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。