Unixで「ls」を使用する場合、最初にディレクトリ、次にファイルなどをソートする方法


91

このlsコマンドを使用して、最初にディレクトリを表示し、次にファイルを表示したいと思います。私は試した:

ls -la | sort -k 1

しかし、注文が間違っていました。


それ-d使用する前に来るためですsort
ニフル

4
昔のUNIXヘッド(GUI以前の時代のもの)は、フォルダ名を大文字にし、その結果を自動的に取得するためにプレーンファイル名を大文字にしませんでした。
-Jロバート

役に立つ質問!おそらく、受け入れられた答えをよりシンプルで端末の色を壊さないものに変更する時が来たのでしょうか?
ippi

試してくださいls -lh --group-directories-first
ディオゴ

回答:


28

次のコマンドは、最初にディレクトリ、2番目に通常のファイル、3番目にリンクを一覧表示します。

ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"

また、キーストロークを保存するためにこのコマンドのエイリアスを作成することは非常に意味があります。

編集:

最初にディレクトリが必要で、次にディレクトリではないものすべてが必要な場合は、これを使用します。

ls -la | grep "^d" && ls -la | grep -v "^d"


1
たとえば、フォルダー内にソケットまたはFIFOがある場合、このコマンドはすべてを一覧表示しません
Studer

1
その編集されたバージョンは、他のタイプでも引き続き機能するはずです。最初のgrepは「d」で始まるすべてを示し、2番目のgrepは「d」で開始しないすべてを示します。確かにすべてが広告で始まるか、そうではないでしょうか?
Ry4anブレース

1
@Mark-なぜ単にしないのです ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep -v -E "^d|^-|^total"か?
FCTW

1
:FCTWのコマンド@ OSXのエイリアスを作成するには、あなたの〜/ .profileにこれを追加alias la="ls -la | grep \"^d\" && ls -la | grep \"^-\" && ls -la | grep -E \"^d|^-\" -v | grep -v \"^total\""
aliteralmind

2
私が働いて短い表記を発見しました:ls -la|grep ^d;ls -la|grep -v ^d(引用符が必要で、交換されていない&&;)。別のオプションは、変数を導入してから評価することですa="ls -la|grep ^d";eval $a;eval $a -v。より多くのオプションがls/に指定されている場合、繰り返しを避けるのに役立ちますgrep。そのls -la --group-directories-firstオプションもありますが、最短のimoはls -la|sort
スティーブンプリビリンスキー

204

* nixが大好きで、これらの返信のいくつかに含まれる独創性を見るのが大好きです...

私のものはGNU Linuxにはあまり似ていません:

alias ls='ls --color -h --group-directories-first'

私は自分のLinux CLIアプリに慣れているので、OSXのcoreutilsも更新する傾向があります。

brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'

6
残念ながら、これは--xオプションが利用できないため、osx端末では機能しません。
MEM

7
再愛:それは皮肉ですか?もしそうなら、私は同意します。
-allyourcode

4
エイリアスlsの目的は、90%の時間で使用する構成要素を定義することです。目的の出力を達成するためのキーストロークが少なくなります。ネイティブのls出力が必要な場合は、いつでも/ bin / lsを使用できます。
ジョナサンセラフィニ14

4
@MEM OS Xを使用していて、Terminalの使用を楽しんでいるならbrew install bash 、これでうまくいくはずです!:)
アンドリューアシュバッハー

5
私の意見:それは正確に目標を達成するためのコマンドラインオプションを示していますので、これは代わりのgrepのなどの複雑なセットで、受け入れ答えされている必要があります
ライアン・グリッグス


7

ディレクトリのリストには特定の項目が表示されますが、ここまでの回答で以下の要件をすべて満たしているものはありません。ディレクトリリストの私の要件:

  1. ディレクトリとファイルはアルファベット順にソートされます
  2. ディレクトリが最初にリストされます
  3. シンボリックリンク(symlinks)はファイルのようにソートされます
  4. ソートは大文字と小文字を区別しません
  5. ソートは、ファイル名の先頭のすべての非アルファ文字を無視します
  6. リストには、ディレクトリ(./およびを除く../)、ファイル、およびリンクの総数が含まれます
  7. リストには、ディレクトリとファイルの合計サイズ(ディスク使用量)が含まれます
  8. リストは、LinuxとWindows(Git Bashシェル)で同じように見える必要があります-これは、--group-directories-firstGit Bash for Windowsで機能しないなどの便利なオプションがあるため、正しく取得するのが最も困難でした

多くのことをハックした後、私はついに1行の(非常に長い行ですが;-)を思い付きました。これを「dir」という名前のエイリアスに割り当てました。

ls -dlF --color * .* | head -n2 && ls -AlF | LC_ALL=C grep "^d" | 
LC_ALL=C sort -k 9df && ls -AlF | LC_ALL=C grep "^[l-]" | 
LC_ALL=C sort -k 9df && echo -e `find -maxdepth 1 -type d ! -name . | 
wc -l` Dir\(s\) `du -hs | cut -f 1`\\t\\t`find -maxdepth 1 -type f | 
wc -l` File\(s\) `find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | 
tail -n 1 | cut -f 1`\\t\\t`find -maxdepth 1 -type l | wc -l` Link\(s\)

物事を管理しやすくするために、ディレクトリリストの各セグメントを好みに応じて出力する個別のコマンドを作成し、&&演算子を使用してそれらを組み立てました。

  • ls -dlF --color * .* | head -n2-抽出./および../。これらsortはすでに正しい順序になっているため、これらをパススルーしたくありません../。それらをソートすると、最初にリストされる場合があります。-dオプションは、「合計」行を取り除くことです。-Fディレクトリの末尾のスラッシュを表示するために追加したいです(プレーンを実行すると、シンボリックリンクに「@」のマークが付けられますls -F)。

  • ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df-ディレクトリを抽出し、ファイル名(9番目の列)で並べ替えます。非アルファ/スペース文字(dオプション)と大文字と小文字(fオプション)の両方を無視します。このls -Aオプションは、前の手順で既に抽出されているため、リストから除外./します../。私はすべてを接頭辞傾向にあるgrepsortしてコマンドLC_ALL=C(1)の出力はUnixシェル全体で一貫性があり、そしてそれはもはやに設定重いUTF-8文字のオーバーヘッドを持っていないので、(2)あなたは時々 、より高速なパフォーマンスを見ることができるようにロケールリセット扱う。

  • ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df -これは上記の手順に似ていますが、今回はファイルとシンボリックリンクを並べ替えています。

  • find -maxdepth 1 -type d ! -name . | wc -l- ./およびを除くディレクトリの数を取得し../ます。

  • find -maxdepth 1 -type f | wc -l -ファイルの数を取得します。

  • find -maxdepth 1 -type l | wc -l -シンボリックリンクの数を取得します。

  • du -hs | cut -f 1 -すべてのサブディレクトリの合計サイズを人間が読める形式で抽出します。

  • find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1 -すべてのファイルの合計サイズを人間が読み取れる形式で抽出します。

dir動作中の新しいエイリアスを見てみましょう!

前:

$ ls -alF
total 22
drwxr-xr-x   13 Tom      Administ     4096 Oct 25 02:38 ./
drwxr-xr-x    3 Tom      Administ        0 Dec 24  2014 ../
drwxr-xr-x   15 Tom      Administ     4096 Sep 17 01:23 .VirtualBox/
-rw-r--r--    1 Tom      Administ      615 Oct 25 02:38 .aliases
-rw-r--r--    1 Tom      Administ    12742 Oct 24 11:47 .bash_history
-rw-r--r--    1 Tom      Administ     3234 Oct 24 15:06 .bash_profile
drwxr-xr-x    1 Tom      Administ        0 Jan 24  2015 .gem/
-rw-r--r--    1 Tom      Administ      586 Oct 24 03:53 .gitconfig
drwxr-xr-x    1 Tom      Administ     4096 Dec 28  2014 .ssh/
drwxr-xr-x    4 Tom      Administ        0 Jan 24  2015 .travis/
-rw-r--r--    1 Tom      Administ     6645 Oct 25 02:38 _viminfo
-rw-r--r--    1 Tom      Administ     4907 Oct 24 15:16 profile
drwxr-xr-x    1 Tom      Administ        0 Oct 24 22:20 tmp/

後:

$ dir
drwxr-xr-x   13 Tom      Administ     4096 Oct 25 02:38 ./
drwxr-xr-x    3 Tom      Administ        0 Dec 24  2014 ../
drwxr-xr-x    1 Tom      Administ        0 Jan 24  2015 .gem/
drwxr-xr-x    1 Tom      Administ     4096 Dec 28  2014 .ssh/
drwxr-xr-x    1 Tom      Administ        0 Oct 24 22:20 tmp/
drwxr-xr-x    4 Tom      Administ        0 Jan 24  2015 .travis/
drwxr-xr-x   15 Tom      Administ     4096 Sep 17 01:23 .VirtualBox/
-rw-r--r--    1 Tom      Administ      615 Oct 25 02:38 .aliases
-rw-r--r--    1 Tom      Administ    12742 Oct 24 11:47 .bash_history
-rw-r--r--    1 Tom      Administ     3234 Oct 24 15:06 .bash_profile
-rw-r--r--    1 Tom      Administ      586 Oct 24 03:53 .gitconfig
-rw-r--r--    1 Tom      Administ     4907 Oct 24 15:16 profile
-rw-r--r--    1 Tom      Administ     6645 Oct 25 02:38 _viminfo
      5 Dir(s) 2.8M           6 File(s) 31K           0 Link(s)

1つの小さな欠点は、ファイル名を囲むカラー制御文字によりソートの信頼性が低下するため、色付きのリストを作成できないことです。


更新

上記のエイリアスは、ディープファイルシステムのルートディレクトリから実行した場合、非常に遅いため、この単純な、しかしはるかに高性能なコマンドに更新しました。

ls -AFoqv --color --group-directories-first | tail -n +2 && find -maxdepth 1 -type f -printf '%s\n' | awk '{total+=$1} END {print total" bytes"}'

サンプル出力:

$ dir
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .aws/
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .gem/
drwxr-xr-x 1 Tom     0 Mar 29 19:32 .ssh/
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .zbstudio/
drwxr-xr-x 1 Tom     0 Jun 16  2016 temp/
drwxr-xr-x 1 Tom     0 Jul 13  2016 vimfiles/
-rw-r--r-- 2 Tom   365 Mar 30 10:37 .aliases
-rw-r--r-- 1 Tom 16028 Mar 30 12:12 .bash_history
-rw-r--r-- 2 Tom  2807 Mar 30 12:12 .bash_profile
-rw-r--r-- 2 Tom  2177 Mar 29 23:24 .functions
-rw-r--r-- 1 Tom  1091 Mar 30 10:34 .gitconfig
-rw-r--r-- 1 Tom  8907 Mar 29 14:45 _viminfo
-rw-r--r-- 1 Tom  2444 Jul 13  2016 _vimrc
33819 bytes

Git Bash for Windowsの新しいバージョンがサポートする--group-directories-firstので、後戻りする必要はありませんsort。新しいエイリアスは以前のエイリアスほど多くの情報を表示しませんが、パフォーマンスの向上は価値があります。特典として、色も取得できます!


素晴らしい答えです!しかし、「多くのハッキングの後、ついにワンライナーを思いついた…」と言うとき、はい、それは実際には古典的な意味での「ワンライナー」ではありません。そのロジックを使用してスタンドアロンシェルスクリプトにし、それを実行するか、エイリアスとして呼び出すのが理にかなっているかもしれません。
JakeGould

@JakeGouldあなたは速い!私はまだ答えの校正を終えていませんし、あなたはすでにそれを読み終えてコメントを打ち落としました:)。ええ、それは関数の最有力候補ですが、当時私はあまりにも面倒だったので、それを.bash_aliasesファイルに放り込みました。一方、私は通常、パラメータを渡さずに何かを実行できない場合にのみ関数を記述します。
thdoan

@ 10basetom:簡単な質問:lsの列のさまざまな色をどのように取得しますか?ls --colorを使用して、ファイルタイプごとにファイル名を色付けできますが、列に役立つ色を付ける方法がわかりません。その秘密は何ですか?
Pirx

@Pirx列はデフォルトのStack Exchange構文強調表示で色付けされていると思います:-)。
thdoan

うん、それはそうだと思われるが、それは素晴らしいアイデアであり、解決策があります;-)
Pirx

6

アルファベット順を維持するかどうかに応じて、いくつかの選択肢があります。

あなたは単に試すことができます:

ls -al | ソート-k1 -r

または、これと同じ許可を持つファイルのアルファベット順を維持するには:

ls -al | sort -k1,1 -k9,9 -r

または、eleven81が言ったように(しかし、このバージョンはすべてをリストしています):

ls -la | grep "^ d" && ls -la | grep "^-" && ls -al | grep -v "^ [d |-]"


1
これはIMOの優れたソリューションです。複数のプロセスとパイプを使用して並べ替えを行うのではなく、並べ替えを行うと、逆方向のように見えます。特にls- al|sort -k1 -r仕事以来。欠けていたのは-rフラグだけです。
ブライス

@brice「ソート」について私を悩ませているのはそれで./あり../、その順序で最初の2行ではありません。それ以外は、より効率的なソリューションであることに同意します。
thdoan

出力に色を付ける方法は?
ダニエル

5

delerious010の答えは、私はあなたが古いスタイルの順序付けたい場合ことを追加します。

LANG=C ls -la --group-directories-first

(またはLC_ALL、LANGUAGE、またはLC_COLLATEを「C」に設定して使用します)。

これにより、次のような結果が得られます。

.
..
DIR
Dir
dir
.hidden
123
UC_FILE
Uc_file
lc_file

ただし、正しく思い出せば、隠しドットファイルはもともとディレクトリの前に表示されていました。


2

これを行う関数(bashまたはzsh)は次のとおりです。そして、...これが最良の方法であることを示唆していませんが、私が思いついて今使用しているものです。

関数lss
{
    #上部にディレクトリを含むディレクトリ一覧を表示します。

    コマンドls --color = always $ @ | egrep '^ d | total'
    コマンドls --color = always $ @ | egrep -v '^ d | total';
}

これだけではうまくいかないようです。このls -lようなファイルタイプでフィルタリングするには、長いリスト形式()を使用する必要があります。また、このコマンドはスペース(bash)で中断します。あなたはそうのように引用する必要があります:"$@"あなたは、このアプローチを使用する場合は、あなたがそうのような何かができる:function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"}

2

ls -laX 最初にディレクトリをアルファベット順に表示しますが、ファイルリストをねじ込みます。

長いオプション:

ls
    -l    # List
    --all
    -X    # Sort alphabetically by entry extension

これは、すべてのディレクトリの名前にドットがないことを完全に確信できる場合にのみ機能します。
eleven81

1

別の方法 ...

find . -d 1 -type d | ls -la | sort -r 

または

ls -la | sort -r

または

d=`find . -type d -d 1`;f=`find . -type f -d 1`; echo -e -DIRS- "\n$d\n" -FILES- "\n$f"

これらは何をしますか?どこでタイプするのを学びましたか?
タマラウィスマン

まあ私の好みのOSはDebian Linuxです。Debianのgnu core utilsパッケージバージョンのlsは--show-directories-firstオプションをサポートしています... OSXの使用を開始したとき、Debianボックスからすべてのbashドットファイルを取得し、ホームディレクトリにドロップしました... I壊れたbash_aliasesがたくさんありました...それから、エイリアスの回避策を見つけなければなりませんでした...
エディB

最初のものは少し冗長です...ディレクトリではなく変更する必要があるため、ディレクトリをソートする理由は本当にありません... 'ls -la | sort -r 'が実際に機能します。基本的にそれは述べています... 1)A)を見つけます。-d 1 -type d(このディレクトリから開始し、ディレクトリの深さを1つ検索し、ディレクトリのみを検索します)B)ls -la(すべての属性をファイルにリストします)C)逆順にソートします2)1)だけfindをドロップします..それは必要ありません...私は実際にStudersのソリューションの方が好きです... :
エディB

1

TL; DR

alias ls='ls -lhF --color'

list_sorted() {
    ls $* | grep "^d";
    ls $* | grep "^-";
    ls $* | grep -v -E "^d|^-|^total"
}

alias ll=list_sorted

説明

ここで回答とコメントで提供されるソリューションの組み合わせを使用します。

デフォルト ls

まず、次のデフォルトの動作を上書きしますls

  • -l:常にリストを1次元の垂直リストとして表示します
  • -h人間が読める形式でファイルサイズを表示します(例:4096ではなく4.0K)
  • -F:ディレクトリの末尾にスラッシュのようなインジケータを表示します
alias ls='ls -lhF --color'

延長 ll

次に、ソートロジックを含む関数を作成します。それぞれlsに対して、最初に渡された引数を渡します。これにより、リストしたいディレクトリとは異なる作業ディレクトリのエイリアスを使用できます(例:)ls -a ~

また、への各呼び出しlsgrepコマンドにパイプされます。ここで、ソートが行われます。ls -l | grep "^d"たとえば、ディレクトリのみをリストします。ディレクトリを最初にリストする必要がある場合、これも関数の最初に来る必要があります。次はファイルです。

最後に、ディレクトリでもファイルでもないものすべてを表示します(ディレクトリの内容の合計サイズを示す行も表示します)。これは、directoy、通常のファイルエントリ、および合計エントリをgrepし、-v引数を介して結果を反転することにより行われます。

list_sorted() {
    # List directories
    ls $* | grep "^d";
    # List regular files
    ls $* | grep "^-";
    # List everything else (e.g. symbolic links)
    ls $* | grep -v -E "^d|^-|^total"
}

最後に、関数を新しいコマンドにエイリアスします。特にls、いくつかのシナリオで関数が壊れた場合に上書きしたくありません。それから私は使えるようになりたいですls。または、をls呼び出すことにより、エイリアスなしのコマンドをいつでも呼び出すことができます\ls

alias ll=list_sorted

ノート

  • ;代わりに&&、コマンドの区切り文字として使用します。それ以外の場合は、1ディレクトリを含まないディレクトリの内容を一覧表示することができません(最初のlsコマンドは、それが結合していますので、このように、次のコマンドの実行を許可しない、falseと評価&&;それを回避することができます。)

0

これはスクリプトソリューションです。名前のみをリストし、inodeデータはなし、アルファベット順、大文字と小文字を区別せず、列にフォーマットします。ただし、lsのデフォルト出力のような列メジャーではなく行メジャーです。26文字を超えるファイル名がある場合、列は少し乱雑になります。

rm -f /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
ls -1p | grep -v / | sort -f >> /tmp/lsout

IFS=$'\n' read -d '' -r -a lines < /tmp/lsout

printf "%-24s  %-24s  %-24s\n" "${lines[@]}"

また、もう1つ、追加の書式設定があります。

rm -f /tmp/lsout
echo "  ---- Directories ---- " >> /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s  %-24s  %-24s\n" "${lines[@]}"

rm -f /tmp/lsout
echo "  ------- Files ------- " >> /tmp/lsout
ls -1p | grep -v / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s  %-24s  %-24s\n" "${lines[@]}"

最後の出力は次のようになりますが、色は含まれていません。

  ---- Directories ----   archive/                  bookmarks/              
Desktop/                  Documents/                Downloads/              
fff/                      health/                   Library/                
Movies/                   Music/                    Pictures/               
Public/                   rrf/                      scifi/            
testdir/                  testdir2/                                         
  ------- Files -------   @todo                     comedy            
delme                     lll                       maxims                  
schedule                  vtokens style

このスクリプトはlsを呼び出すため、lsのデフォルトの動作をエイリアスしたり変更したりしないでください。

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