制作目录中文件数量的*漂亮*格式列表 - 可能是 awk 和 sed

制作目录中文件数量的*漂亮*格式列表 - 可能是 awk 和 sed

我在一系列目录中有很多很多文件,并且想要一个格式很好每个目录中有多少个文件的列表。

目录的顺序如下: 名为 A、B、... H、I 的父目录。在每个目录下,有 1 到 7 个名为 001、002、... 007 的目录。在这些目录中,文件 I' d 喜欢文件的数量。

我所希望的是这样的:

...
C/003 122
C/004 45
C/005462
D/001 215
E/001 98
E/002 323
...

我正在考虑目录名称和计数之间的选项卡。计数是左对齐还是右对齐并不重要。

我自己所做的基本上是这样的:

(对于我来说*/*
  回声>>> $i"
  ls“$i”|厕所
完成)> 文件计数

结果是这样的:

...
>>> F/002
  30 30 234
>>> F/003
  120 120 1322
>>> G/001
  78 78 620
...

显然,还不错......如果我替换wcwc -l删除“>>>”,那就更好了 -除了每个“记录”将超过两行而不是一行。

所以我需要的是一些awksed(或任何- 有没有比这两条线更简单的工具来连接两条线?)将两条线和两条线连接成一条线的魔术。

但是,如果有更直接的方法(shell脚本、perl、python、一些真的很黑sed 和 awk magic)可以“一次性”列出一个列表,那会更好......

答案1

假设您的文件名不包含换行符并且grep支持 -o 选项:

find [[:upper:]] -type f | grep -Eo '^./[0-9]{3}' | sort | uniq -c

答案2

您可以分别为每个目录构建一个文件数组,然后只计算元素的数量。那bash会是这样的

for dir in */*/; do a=( "$dir"/* ); printf "%s\t%s\n" "$dir:" "${#a[@]}"; done

如果A/001etc. 也包含您想要包含的内容的目录,则添加**glob:

shopt -s globstar
for dir in */*/; do a=( "$dir"/**/* ); printf "%s\t%s\n" "$dir:" "${#a[@]}"; done

答案3

获得所需内容的最简单方法是在打印目录名称时使用-n选项。echo这可以避免在您回显的内容末尾打印换行符,因此下一个输出保持在同一行。如果您想收集所需的信息,然后在提供输出之前对其运行多个转换,那么其他语言可能是更好的选择。

答案4

也许是这样的:

find $PWD/ -type f -printf "%h\n\0" | uniq -zc

产生类似:

  7 /foo
 17 /foo/bar
  9 /foo/baz

| sort -z在前面添加一个| uniq以对其进行排序。

相关内容