【问题标题】:Counting subdirectories within a directory计算目录中的子目录
【发布时间】:2013-10-15 16:57:50
【问题描述】:

使用 Mac OS X 10.8.5。认为在命令行上执行此操作最有意义,但欢迎提出其他建议。

我有一个包含各种备份的目录。这里大约有 45 个备份,每个备份都是定期运行的增量阶段。每个备份目录的目录结构是相同的,但每个备份目录的顶级/父目录具有不同的名称(时间戳)。示例:

2013_9_12_0500/Files/MoreFiles/SomethingElse/Folder/subfolder/morefolders
2013_9_12_0600/Files/MoreFiles/SomethingElse/Folder/subfolder/morefolders
2013_9_12_0700/Files/MoreFiles/SomethingElse/Folder/subfolder/morefolders
2013_9_12_0800/Files/MoreFiles/SomethingElse/Folder/subfolder/morefolders
2013_9_12_0900/Files/MoreFiles/SomethingElse/Folder/subfolder/morefolders
2013_9_12day/Files/MoreFiles/SomethingElse/Folder/subfolder/morefolders
2013_9_13day/Files/MoreFiles/SomethingElse/Folder/subfolder/morefolders
2013_9_14day/Files/MoreFiles/SomethingElse/Folder/subfolder/morefolders
2013_9_10week/Files/MoreFiles/SomethingElse/Folder/subfolder/morefolders

等等

“子文件夹”目录本身包含许多子目录。我想计算每个“子文件夹”目录中有多少子目录。示例:

2013_9_12_0500/Files/MoreFiles/SomethingElse/Folder/subfolder/  =>  884 subdirs
2013_9_12_0600/Files/MoreFiles/SomethingElse/Folder/subfolder/  =>  1423 subdirs
2013_9_12_0700/Files/MoreFiles/SomethingElse/Folder/subfolder/  =>  540 subdirs
2013_9_12_0800/Files/MoreFiles/SomethingElse/Folder/subfolder/  =>  378 subdirs

等等……

这个命令我运气不错:

 find ./*/*/*/*/*/subfolder -type d | wc -l

问题在于它只显示了所有“子文件夹”的总数,而不是每个子文件夹中的计数。例如。 “13543”而不是上面列出的。

是的,我可以一次手动完成一个,但是学习新东西是不是很兴奋? :)

谢谢, C

【问题讨论】:

  • 你基本上想要一个相当于 sql 的group by 的命令行,在子文件夹所在的父文件夹上分组。使用简单的find|wc 命令是不可能的。您需要一些额外的代码(sed/awk/perl/whatever)来为您进行分组。
  • 是的,对我想要实现的目标进行了很好的总结。这将涉及额外的步骤。我已经做了一些 Sed/Awk-ing,但不久前还不错。 :)

标签: macos file command-line count terminal


【解决方案1】:

下面的很多恶作剧都是处理文件夹名称中的空格,但我认为这个函数会生成你的输出......

用法:countsubdirs PUT/PATH/HERE

countsubdirs(){
    ORIGIFS=$IFS
    IFS=$(echo -en "\n\b")
    DIRS=$(find "$1" -maxdepth 1 -mindepth 1 -type d )
    for D in $DIRS; do echo $D "=>" $(find $D -maxdepth 1 -mindepth 1 -type d | wc -l) subdirs; done
    IFS=$ORIGIFS
}

输出:

temp/hello =>        1 subdirs
temp/ntest 4 =>        0 subdirs
temp/temp =>        0 subdirs
temp/test =>        2 subdirs
temp/test 4 =>        0 subdirs
temp/test3 =>        1 subdirs
temp/tester =>        0 subdirs
temp/xl =>        1 subdirs

【讨论】:

  • 假设这是一个shell脚本,我让它工作了!谢谢!我做了一个小的修改:我将您设置的“dirs”变量更改为如下所示:“DIRS=$(find .-name TOC)”。也许不像做一个 awk/sed 组合那么性感,但它运作良好。 :)
  • 只要它有效,我就全力以赴。是的,它是一个 shell 函数(如扩展别名)。我发现它比 shell 脚本更容易使用,因为如果您将这些行添加到 .bash_profile,那么该命令将在任何终端窗口中可用。很高兴您能够对其进行编辑以适合您的特定应用程序。如果您想使输出对齐,您可以使用printf 代替echo... 最后,我不确定您是否只想要直接子目录或嵌套子目录,所以这显然只立即执行。
  • 只有立即的意图。
【解决方案2】:

你为什么不这样做

for d in ./*/*/*/*/*/subfolder; do
    printf "%s\t" "$d"
    find "$d" -type d -printf "%i\n" | wc -l
done

find 命令的 -printf 选项是一种保护措施,以防您的目录名称带有换行符或其他内容。

【讨论】:

  • @nyxee“没用”怎么办?通配符肯定会遍历所有匹配的目录,find | wc 肯定会计算每个匹配项中的目录。也许您需要一个不同的通配符?
猜你喜欢
  • 2018-08-10
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 2016-05-16
  • 2021-08-25
相关资源
最近更新 更多