我想使用该file
工具快速概述目录(包括其所有子目录)中的不同文件类型,例如告诉我哪种文件类型是最常见的文件类型。
bash
它应该用常见的 shell 语言或脚本工具(如或 )实现为实用的 shell 脚本awk
。
可能的必备品:
- 很好的表现
- 处理任何文件名或类型
- POSIX 兼容性
(最后两点实际上是互斥的)
答案1
用于sort | uniq -c
计算相同行数:
find "$path" -type f -exec file -b {} + | sort | uniq -c | sort -nr
答案2
Bash 4 解决方案利用关联整数数组并适用于具有零分隔符扩展的环境。第一个参数是目标目录,以下所有参数都转发到file
:
#!/bin/bash
# USAGE: script.sh PATH [PARAMS_FOR_FILE_CMD...]
# EXAMPLE 1: ./script.sh .
# EXAMPLE 2: ./script.sh /tmp --mime-type
path=$1
shift
if [[ ! -d "$path" ]]; then
echo 'Path expected as first argument!' >&2
echo "Usage: $(basename "$0") PATH [PARAMS_FOR_FILE_CMD...]" >&2
exit 1
fi
declare -Ai type_stats
while IFS= read -r -d '' f; do
t=$(file -b "$@" -- "$f")
type_stats[$t]+=1
done < <(find "$path" -type f -print0)
for t in "${!type_stats[@]}"; do
printf '\n%s\n-> %s\n\0' "$t" "${type_stats[$t]}"
done | sort -zrn -t'>' -k2
性能应该不错,我猜它处理所有文件名和类型(但不完全确定,例如,除非其中有带有“>”的类型)。
答案3
我知道这个线程很旧,但是,这是搜索“bash 计数文件扩展名”时的最佳结果之一。
我遇到了和你一样的问题,并创建了一个类似于 JigglyNaga 的脚本
这是我执行的命令,它递归地计算工作目录和子文件夹中所有文件的扩展名。这会考虑 UPPER 和 LOWER 情况,合并它们,删除误报结果并计算出现次数。
find . -type f | tr '[:upper:]' '[:lower:]' | grep -E ".*\.[a-zA-Z0-9]*$" | sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' | sort | uniq -c | sort -n
如果您想查看更多文档,请点击 github 链接。