递归检查目录名称的长度

时间:2012-04-30 17:50:03

标签: bash

我需要确定是否有任何目录名称>给定目录中的31个字符(即在该根目录下查找)。

我知道我可以使用find /path/to/root/dir -type d >> dirnames.txt

之类的东西

这将给我一个完整路径的文本文件。

我需要的是获取每个目录名称中的实际字符数。不确定解析上述结果w / sed或awk是否有意义。寻找关于如何实现这一目标的想法/想法/建议/提示。谢谢!

3 个答案:

答案 0 :(得分:2)

这个简短的脚本一次性完成所有操作,即查找所有目录名称,然后输出长度超过31个字符的任何内容(以及它们的字符长度):

for d in `find  /path/to/root/dir -type d -exec basename {} \;` ; do
  len=$(echo $d | wc -c)
  if [ $len -gt 31 ] ; then
    echo "$d = $len characters"
  fi
done

答案 1 :(得分:0)

使用由find cmd创建的dirnames.txt文件,然后可以按路径名的长度对数据进行排序,即

 awk '{print length($0) "\t" $0}' dirnames.txt | sort +0nr -1 > dirNamesWithSize.txt

这将显示文件顶部的最长路径名称(基于长度值)。

我希望这会有所帮助。

答案 2 :(得分:0)

试试这个

 find . -type d -exec bash -c '[ $(wc -c <<<"${1##*/}") -gt 32 ] && echo "${1}"' -- {} \; 2>/dev/null

我认为是一个小错误,它每次都会超过1个目录名长度。

如果您想要的是整个路径而不是最后一个路径组件,那么请使用:

find . -type d | sed -e '/.\{32,\}/!d'

这个版本也有一个错误,但只有当文件名中嵌入了换行符时才会出现。

两个命令的输出都是符合条件的文件名列表。从那里算出每一个的长度是微不足道的。