ファイル拡張子と名前でlsをソートする方法は?


44

デフォルトでは、lsコマンドはファイル名だけでソートしますが、他のファイルタイプの前にディレクトリが表示されるようにします。Windowsエクスプローラーがタイプ列でソートする方法のように、ファイルを拡張子でソートしたい場合もあります。lsで似たようなことをする方法はありますか?

回答:


42

完全な答えは、上記の組み合わせに近いと思います。

-X (later --sort=extension)少なくともFC3以降、Linuxでサポートされており、拡張子に基づいてソートされます。--group-directories-first最近追加されました(おそらくFC8ですか?)。ただし、2つを組み合わせても機能しないようです(少なくともFC8では)。

主な問題は、単一のプライマリソートキーの使用にあるようです。それについての洞察については、このメーリングリストの説明を参照してください。


5
私はこの投稿がかなり古いことを知っていますが、たとえばGoogleからここに来る他の人には(私がしたように):Ubuntu 12.10では私--sort=extension--group-directories-first(または唯一の--group-directories)組み合わせがうまくいきます あなたのマシンでも一見の価値があります!=)
トマスアスチャン

はい、最近のLinuxディストリビューションで試したものと組み合わせ-X / --sort=extensionても問題ありません--group-directories-first。OPはFedora Core 8(2007年リリース)を参照しているため、このような問題は遠い過去にある可能性があります。
マットスト



13

bashでは、これは一種の作業になります。

$ ls | rev | sort | rev

からman rev

 The rev utility copies the specified files to the standard output,
 reversing the order of characters in every line.  If no files are speci-
 fied, the standard input is read.

したがって、1。lsは、必要なフラグを使用して出力を提供します。2。各行が反転します。3。その後、ソートされます。

  1. このような:
  2. 各行が反転します
  3. その後、それらはソートされます
  4. そして再び逆に
  5. lsは、必要なフラグを付けて出力を提供します

または、以下のように、もっと重要です。それらは、最後の文字、最後から2番目などでソートされます。たとえば、すべての.rtfファイルは、.saveファイルと、拡張子が「e」で終わる別のファイルの後に一緒にリストされます。その後、.pngファイルなどが続きます。これはls -lでも機能します。これは、拡張子が通常行の最後にあるためです(リンクの後にターゲットが続く「tmp @-> / home / jones / tmp」のような行がある場合を除く)。

$ ls | rev | sort | rev
 cslu1
 ls.mp2
 ls.mp3
 ls.mp4
 trees_110214-15
 パット
 CSLU
 プロキシForm.doc
 フィナンビッド
 とんび
 101209ssi.txt.save
 to_annotate_size
 Matas-time-by-week-integration2.rtf
 cyp3.rtf
 data-dir-scan.perl.doc.rtf
 whence-r21-numid.rtf
 platypus.rtf
 スクリーンショット2011-01-21 at 2.17.50 PM.png
 emacs print help.png
 ログ
 new_month_log
 特殊な
 Google-ngram-critique.html
 perl_path.html
 nl
 DWE_BEN_89808.2.ann
 foo
 ドフー
 100811_from_iMac_Documents_in_dock.zip
 to-palikir.zip
 tmp
 ファイルクリーンアップ
 バー
 データスキャンドキュメント
 cmp-mg-ann-numids
 finished_numids
 to_annotate_numids
 manls.ps
 Mike_address_ticket
 cyp2.out
 cyp3.out
 Locate-cyp.out
 manls.out
 DWE_BEN_89808.2.text
 tag2.txt
 l2.txt
 du-h-d3.txt
 finished_ann_numids_110407_1714.txt
 finished_all_numids_110407_1718.txt
 data-dir-scan.perl.doc.txt
 whence-r21-numid.txt
 finannid.txt
 toannid.txt
 b9-workspace-anndiff.txt
 tag.txt
 duh.txt
 do-mail.txt
 safextn.txt
 mg3longhdr.txt
 finished_numids.txt
 41692-langnames.txt
 TimeAnnotationGuidelines.txt
 41langs.txt
 thing4-homedir-links.txt
 bnlinks.txt
 grants.txt
 mata-file-reports.txt
 logx.txt
 logx
 b9-workspace-anndiff.txt〜
 bnlinks.txt〜 

1
ただし、ディレクトリを最初にリストしません。
-CarlF

あなたならls -F
グレンジャックマン

努力のために+1 ...
varun

@glennjackmanそれはましです。答えがあるはずです。

それは素敵な(特に持つだろう-Fを通してそれをパイプ場合)revsort(色を削除しませんでした-G)。

3

Linuxを使用していない場合、

ls -l |sort -d -k 1.1,1.1r -k 9 |awk '{print $9}'

最初にディレクトリを並べ替える必要があります(間違っている場合は教えてください)。ただし、拡張子で並べ替えるわけではありません。それを行うには、awkステートメントを非常に忙しくする必要があります...


スペースを含む名前でも動作させるには、おそらくawkをsed -E -e 's/([^ ]+[ ]+){8}//'9番目を印刷する代わりに最初の8つのフィールドを取り除くようなものに置き換えます


実際、これはLinuxでも機能すると確信していますが、他の人が述べているように、そこには組み込みのサポートがあります。
ザックトンプソン

1
Macで動作します。CLICOLORこれを有効にした場合、色が削除されることに注意してください。
-eykanal

1
スペースを含むファイル名に対して誤った結果が得られます。
グレンジャックマン

@glenn、あなたは正しいです...これが懸念であれば、おそらくawkをsed -E -e 's/([^ ]+[ ]+){8}//'9番目を印刷する代わりに最初の8つのフィールドを取り除くようなものに置き換えます
ザック・トンプソン

ls -l |sort -d -k 1.1,1.1r -k 9 | cut -c 50-
-nohillside

2

Linuxで実行している場合、GNU lsは次の--sortオプションをサポートしています。

ls --sort=extension

求められたものではありません。
シュリダールSarnobat

0

良いアプローチは、最初にフォルダを分離し、次に、拡張子ソートされたファイルをソートしソートして戻すことです:

ls -p | grep /;ls -p | grep -v / | rev | sort | rev

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.