我在一系列目录中有很多很多文件,并且想要一个格式很好每个目录中有多少个文件的列表。
目录的顺序如下: 名为 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 ...
显然,还不错......如果我替换wc
并wc -l
删除“>>>”,那就更好了 -除了每个“记录”将超过两行而不是一行。
所以我需要的是一些awk
或sed
(或任何- 有没有比这两条线更简单的工具来连接两条线?)将两条线和两条线连接成一条线的魔术。
但是,如果有更直接的方法(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/001
etc. 也包含您想要包含的内容的目录,则添加**
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
以对其进行排序。