3

フォルダ内のすべてのファイル拡張子タイプを取得する必要があります。たとえば、ディレクトリのlsが次のようになっている場合:

a.t  
b.t.pg  
c.bin  
d.bin  
e.old  
f.txt  
g.txt  

スクリプトを実行してこれを取得する必要があります

.t  
.t.pg  
.bin  
.old  
.txt  

私はbashシェルを持っています。

どうもありがとう!

4

3 に答える 3

7

これらの回答の多くが悪である理由の説明については、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連想配列ストレージアプローチによって修正できます。
于 2012-04-16T15:36:05.063 に答える
3

これを試して:

ls -1 | sed 's/^[^.]*\(\..*\)$/\1/' | sort -u
  • lsフォルダ内のファイルを1行に1ファイルずつ一覧表示します
  • sed魔法は拡張機能を抽出します
  • sort -u拡張機能を並べ替えて重複を削除します

sedの魔法は次のように読みます:

  • s/ / /:1番目と2番目の間にあるもの/2番目と3番目の間にあるものに置き換えます/
  • ^:行頭に一致
  • [^.]:ドット以外の文字に一致する
  • *:可能な限り一致させる
  • \(および\):これらの2つの括弧の間で一致するものは何でも覚えておいてください
  • \.:ドットに一致
  • .:任意の文字に一致
  • *:可能な限り一致させる
  • $:行末に一致
  • \1:これは括弧の間で一致したものです
于 2012-04-16T15:40:25.360 に答える
0

人々はこれを本当に複雑にしすぎています-特に正規表現:

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
于 2012-04-16T15:47:22.537 に答える