パス(サブフォルダを含む)のファイル形式を計算するBashスクリプト

パス(サブフォルダを含む)のファイル形式を計算するBashスクリプト

fileこのツールを使用して、ディレクトリ(すべてのサブディレクトリを含む)のさまざまなファイル形式の概要をすばやく確認したいと思います。たとえば、どのファイル形式が最も一般的かを教えてください。

bashこれは、一般的なシェル言語またはスクリプトツール(orなど)を使用して実用的なシェルスクリプトとして実装する必要がありますawk

利用可能な商品:

  • 非常に良いパフォーマンス
  • すべてのファイル名またはタイプを処理します。
  • POSIX互換性

(最後の2点は実際には相互に排他的です)

答え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計算ファイル拡張子」を検索するときの最高の結果の1つです。

私はあなたと同じ問題があり、JiggglyNagaに似たスクリプトを作成しました。

以下は、作業ディレクトリとサブフォルダ内のすべてのファイルの拡張子を再帰的に計算するコマンドを実行したものです。これは、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

関連情報