移行プロジェクトのためにウェブサイトをスクレイピングしました。ファイル形式の統計を作成したい(例:400.html
ファイル、100.gif
ファイルなど)。これを行う簡単な方法はありますか?再帰的でなければなりません。
編集する:maxschhelpzigによって公開されたスクリプトを使用してスクラップしていたサイトのアーキテクチャにより、いくつかの問題が発生しました。一部のファイルには*.php?blah=blah&foo=bar
異なるパラメータを含む名前があるため、すべて一意に処理されます。したがって、解決策は*.php*
言えば、同じ種類をすべて考慮する必要があります。
答え1
これにはfind
andを使用できます。たとえば、次のようになります。uniq
$ find . -type f | sed 's/.*\.//' | sort | uniq -c
16 avi
29 jpg
136 mp3
3 mp4
命令の説明
find
すべてのファイル名を再帰的に印刷sed
各ファイル名からファイル拡張子までの接頭辞を削除します。uniq
入力がソートされたとします。-c
(ヒストグラムのように)数字を数えます。
答え2
この一行のアプローチは非常に強力なアプローチのようです。
find . -type f -printf '%f\n' | sed -r -n 's/.+(\..*)$/\1/p' | sort | uniq -c
find . -type f -printf '%f\n'
ディレクトリなしでツリー内の各一般ファイルのデフォルト名を印刷します。これにより、正規表現.
に含めることができるディレクトリを心配する必要がなくなりますsed
。
sed -r -n 's/.+(\..*)$/\1/p'
受信ファイル名を対応する拡張子にのみ変更します。たとえば、正規表現の最初の文字に注意してください。これにより、一致に拡張子の前に少なくとも1つの文字が.somefile.ext
必要.ext
です。これにより、ファイル名がまったく名前がなく、拡張子 ".gitignore"(おそらく望むものかもしれません)がないものとして扱われることを防ぎます。それ以外の場合は、交換してください。.+
.
.gitignore
.+
.*
残りの行は許可された答えから来ます。
編集する:よく整列したヒストグラムが必要な場合パレートチャート書式を指定するには、sort
最後に別の書式を追加してください。
find . -type f -printf '%f\n' | sed -r -n 's/.+(\..*)$/\1/p' | sort | uniq -c | sort -bn
ビルドされたLinuxソースツリーの出力例:
1 .1992-1997
1 .1994-2004
1 .1995-2002
1 .1996-2002
1 .ac
1 .act2000
1 .AddingFirmware
1 .AdvancedTopics
[...]
1445 .S
2826 .o
2919 .cmd
3531 .txt
19290 .h
23480 .c
答え3
zsh1の使用:
print -rl -- **/?*.*(D.:e) | uniq -c |sort -n
これ模様 **/?*.*
現在のディレクトリとサブディレクトリの拡張子を持つすべてのファイルを再帰的に一致させます。これD
グローバル予選zsh
隠しディレクトリに移動し、隠されたファイルも考慮して.
一般的なファイルのみを選択します。これ:e
修飾子ファイル拡張子のみが保持されます。print -rl
1行に1つの一致を印刷します。uniq -c
連続した同じアイテム数を計算します(全体の結果はすでにソートされています)。最後の呼び出しは、sort
使用回数に基づいて拡張プログラムをソートします。
¹そして、ファイル拡張子に改行文字が含まれていないとします。
答え4
このスレッドは古いですが、「bash計算ファイル拡張子」を検索するときの最高の結果の1つです。
私はあなたと同じ問題があり、maxschlepzigに似たスクリプトを作成しました。
以下は、作業ディレクトリ内のすべてのファイルの拡張子を再帰的に計算するコマンドです。これは、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のリンクをクリックしてください。