ファイルの拡張子を探しています。 Cut はファイルに拡張子がない場合にのみファイル名を提供するので、「.」がない場合に Cut に「拡張子なし」を提供したいと思います。私はこれを参照として使用していることがわかりました。https://stackoverflow.com/questions/1842254/how-can-i-find-all-of-the-distinct-file-extensions-in-a-folder-hierarchy拡張子のないファイルは無視するという答えは悪いです。このようなファイルも探さなければならないからです。
答え1
zsh
シェルから:
print -rC1 ./**/*(.:e) | sed 's/^$/EXTENSIONLESS/' | sort | uniq -c
これにより、現在のディレクトリ内または下のすべての一般ファイルに対して、1行にすべての拡張子が印刷されます。空の拡張子は、ソートおよび計算前にEXTENSIONLESS
テキストに置き換えられます。sed
**
パス名のglobは、そのシェルにシェルオプションが設定されている場合と同じパターンと(「再帰的に」)zsh
一致します。/
bash
globstar
(.:e)
パターンの末尾には、前のパターンが通常のファイルにのみ一致するようにし、一致する各(.)
名前()から拡張子を除くすべての項目を削除するグローバル修飾子があります:e
。
同じではあるがdummy.EXTENSIONLESS
拡張子のないファイル名をワイルドカード式のファイル名に置き換える式を使用してe['...']
呼び出しを削除しますsed
。
print -rC1 src/**/*(.e['[ -z $REPLY:e ] && REPLY=dummy.EXTENISONLESS']:e) | sort | uniq -c
シェルでない場合は、インラインシェルスクリプトを使用して上記のパイプラインの最初の部分を実行zsh
できます。find
find . -type f -exec sh -c '
for pathname do
name=${pathname##*/}
case $name in
*.?*)
printf "%s\n" "${name##*.}" ;;
*)
echo EXTENSIONLESS
esac
done' sh {} + | sort | uniq -c
find
これは、現在のディレクトリ内または下のすべての一般的なファイルを見つけるために使用されます。これらのファイル配置の場合は、インラインシェルスクリプトを呼び出します。スクリプトは現在のパス名のセットを繰り返し、各パス名のファイル名部分を変数として抽出しますname
。次に、ドット$name
と少なくとも1つの他の文字が含まれていることをテストします。名前にドットがある場合はドットの後ろの部分が印刷され、そうでない場合はEXTENTSIONLESS
文字列が印刷されます。
find
その後、出力は以前と同じ方法でソートされ計算されます。
上記のコードはhello.
拡張子と同様の名前で名前を呼び出しますが、.bashrc
拡張子を持ちます。ドットの両側に文字が必要になるようにbashrc
モードを変更します(拡張子のないものとして扱われます)。*.?*
*?.?*
.bashrc