区切り文字が見つからないときに用語を出力するようにカットを発生させます。

区切り文字が見つからないときに用語を出力するようにカットを発生させます。

ファイルの拡張子を探しています。 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一致します。/bashglobstar

(.: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

関連情報