フォルダ内のすべてのファイル拡張子タイプを取得する必要があります。たとえば、ディレクトリのlsが次のようになっている場合:
a.t
b.t.pg
c.bin
d.bin
e.old
f.txt
g.txt
スクリプトを実行してこれを取得する必要があります
.t
.t.pg
.bin
.old
.txt
私はbashシェルを持っています。
どうもありがとう!
これらの回答の多くが悪である理由の説明については、ParsingLSのBashFAQエントリを参照してください。
次のアプローチは、この落とし穴を回避します(ちなみに、拡張子のないファイルは完全に無視します)。
shopt -s nullglob
for f in *.*; do
printf '%s\n' ".${f#*.}"
done | sort -u
利点の中で:
ls
動作に一貫性がなく、不適切な結果になる可能性があります。上部のリンクを参照してください。sort -u
結果を格納するためにBash 4の連想配列を使用する場合にも削除できるのは1つだけです)まだ改善できること:
.
(他の回答では破棄されません)。ただし、最初の行の後に改行があるファイル名は、.
によって個別のエントリとして扱われますsort
。これは、区切り文字としてnullを使用するか、前述のbash4連想配列ストレージアプローチによって修正できます。これを試して:
ls -1 | sed 's/^[^.]*\(\..*\)$/\1/' | sort -u
ls
フォルダ内のファイルを1行に1ファイルずつ一覧表示しますsed
魔法は拡張機能を抽出しますsort -u
拡張機能を並べ替えて重複を削除しますsedの魔法は次のように読みます:
s/ / /
:1番目と2番目の間にあるもの/2番目と3番目の間にあるものに置き換えます/^
:行頭に一致[^.]
:ドット以外の文字に一致する*
:可能な限り一致させる\(
および\)
:これらの2つの括弧の間で一致するものは何でも覚えておいてください\.
:ドットに一致.
:任意の文字に一致*
:可能な限り一致させる$
:行末に一致\1
:これは括弧の間で一致したものです人々はこれを本当に複雑にしすぎています-特に正規表現:
ls | grep -o "\..*" | uniq
ls
-すべてのファイルを取得します
grep -o "\..*"
--o
一致するものだけを表示します。"\..*"
最初の「。」で一致します &その後のすべて
uniq
-重複を印刷せず、同じ順序を維持します
必要に応じて並べ替えることもできますが、並べ替えは例と一致しません
これはあなたがそれを実行したときに起こることです:
> ls -1
a.t
a.t.pg
c.bin
d.bin
e.old
f.txt
g.txt
> ls | grep -o "\..*" | uniq
.t
.t.pg
.bin
.old
.txt