用于计算路径中文件类型(包括子文件夹)的 Bash 脚本

用于计算路径中文件类型(包括子文件夹)的 Bash 脚本

我想使用该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 链接。

https://github.com/Hoppi164/list_file_extensions

相关内容