回答:
これを試してください(それが最善の方法かどうかはわかりませんが、うまくいきます):
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
次のように機能します。
git ls-tree -r HEAD --name-only
find
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort | uniq -c | sort -n
パイプを必要とせずsort
、awkはそれをすべて実行できます。
find . -type f | awk -F. '!a[$NF]++{print $NF}'
alias
コマンドのワンライナー全体を引用符で囲むことですが、コマンド自体はすでにfindコマンドで引用符を使用しています。これを修正するために私が使用しますbash
:ようさんリテラル文字列構文をalias file_ext=$'find . -type f -name "*.*" | awk -F. \'!a[$NF]++{print $NF}\''
maindir/test.dir/myfile
-printf "%f\n"
'find'コマンドの最後に追加して、テストを再実行します。
再帰バージョン:
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
合計が必要な場合(拡張子が表示された回数):
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort | uniq -c | sort -rn
非再帰的(単一フォルダー):
for f in *.*; do printf "%s\n" "${f##*.}"; done | sort -u
私はこれをこのフォーラム投稿に基づいています、クレジットはそこに行くべきです。
git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
パワーシェル:
dir -recurse | select-object extension -unique
http://kevin-berridge.blogspot.com/2007/11/windows-powershell.htmlに感謝
.
中にaがあるディレクトリも取得します(たとえば、出力のjquery-1.3.4
よう.4
に表示されます)。dir -file -recurse | select-object extension -unique
ファイル拡張子のみを取得するように変更します。
私のawkなし、sedなし、Perlなし、PythonなしのPOSIX準拠の代替:
find . -type f | rev | cut -d. -f1 | rev | tr '[:upper:]' '[:lower:]' | sort | uniq --count | sort -rn
トリックは、ラインを反転させ、最初にエクステンションをカットすることです。
また、拡張子を小文字に変換します。
出力例:
3689 jpg
1036 png
610 mp4
90 webm
90 mkv
57 mov
12 avi
10 txt
3 zip
2 ogv
1 xcf
1 trashinfo
1 sh
1 m4v
1 jpeg
1 ini
1 gqv
1 gcs
1 dv
uniq
完全な旗を持っていません--count
が、-c
うまく動作します
ドットですべてを見つけ、サフィックスのみを表示します。
find . -type f -name "*.*" | awk -F. '{print $NF}' | sort -u
すべてのサフィックスが3文字であることがわかっている場合
find . -type f -name "*.???" | awk -F. '{print $NF}' | sort -u
またはsedを指定すると、1から4文字のすべてのサフィックスが表示されます。{1,4}を、サフィックスで予期される文字の範囲に変更します。
find . -type f | sed -n 's/.*\.\(.\{1,4\}\)$/\1/p'| sort -u
自分のバリエーションをミックスに追加する。これは最も単純な方法であり、効率がそれほど重要ではない場合に役立ちます。
find . -type f | grep -o -E '\.[^\.]+$' | sort -u
$ find . -type f | grep -o -E '\.[^.\/]+$' | sort -u
Pythonでは、空白の拡張を含む非常に大きなディレクトリにジェネレータを使用し、各拡張が表示される回数を取得します。
import json
import collections
import itertools
import os
root = '/home/andres'
files = itertools.chain.from_iterable((
files for _,_,files in os.walk(root)
))
counter = collections.Counter(
(os.path.splitext(file_)[1] for file_ in files)
)
print json.dumps(counter, indent=2)
私はここでたくさんの答えを試してみました。「最良の」答えですら。それらはすべて私が具体的に求めていたものに届かなかった。したがって、過去12時間の複数のプログラムの正規表現コードに座ってこれらの回答を読んでテストすることに加えて、これは私が思いついたとおりに機能するものでした。
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort -u
ファイル拡張子の数が必要な場合は、以下のコードを使用してください
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort | uniq -c | sort -rn
これらの方法は完了するまでにしばらく時間がかかり、おそらく問題を解決する最良の方法ではありませんが、機能します。
更新:@ alpha_989の長いファイル拡張子により問題が発生します。これは、元の正規表現「[[:alpha:]] {3,6}」が原因です。正規表現「[[:alpha:]] {2,16}」を含めるように回答を更新しました。ただし、このコードを使用するユーザーは、これらの数値が最終出力で拡張が許可される期間の最小および最大であることを認識しておく必要があります。その範囲外のものはすべて、出力で複数行に分割されます。
注:元の投稿では、「3〜6文字のファイル拡張子のグレープ(必要に応じて数値を調整してください)を読んでいます。これにより、キャッシュファイルやシステムファイルを回避できます(システムファイルビットは刑務所を検索するためです)。 」
アイデア:次の方法で特定の長さのファイル拡張子を見つけるために使用できます。
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{4,}" | awk '{print tolower($0)}' | sort -u
ここで、4は含めるファイル拡張子の長さで、その長さを超える拡張子も検索します。
これまでのところ、返信は改行付きのファイル名を適切に処理していません(これを入力しているときに入ったChristopheDを除きます)。以下はシェルのワンライナーではありませんが、動作し、かなり高速です。
import os, sys
def names(roots):
for root in roots:
for a, b, basenames in os.walk(root):
for basename in basenames:
yield basename
sufs = set(os.path.splitext(x)[1] for x in names(sys.argv[1:]))
for suf in sufs:
if suf:
print suf
これはまだ言及されていないと思います:
find . -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c
受け入れられた回答はREGEXを使用しており、REGEXを使用してエイリアスコマンドを作成することはできません。これをシェルスクリプトに挿入する必要があります。AmazonLinux 2を使用しており、次のようにしました。
受け入れた回答コードをファイルに入れます:
sudo vim find.sh
このコードを追加します。
find ./ -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
次のように入力してファイルを保存します。 :wq!
sudo vim ~/.bash_profile
alias getext=". /path/to/your/find.sh"
:wq!
. ~/.bash_profile
.svn
find . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u