web-dev-qa-db-ja.com

Unixで「ls」を使用しているときに、最初のディレクトリ、次にファイルなどをソートする方法

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

ls -la | sort -k 1

しかし、私は間違った命令を受けました。

86
atricapilla

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

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

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

編集:

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

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

26
eleven81

私はとても愛* 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'
197

Macユーザーのために coreutils

brew install coreutils

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

あなたのシステムが 自作 の準備ができていると仮定します。

16
Vadym Tyemirov

アルファベット順にしたい場合は、いくつかの選択肢があります。

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

ls -al sort -k1 -r

あるいはこれと同じパーミッションを持つファイルのアルファベット順を守るために:

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

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

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

6
Studer

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

しかし、私が正しく思い出した場合、隠しドットファイルはもともとディレクトリの前に現れました。

5

ディレクトリ一覧に表示したいことがいくつかありますが、これまでのところ、ここに挙げた答えはどれも以下の要件をすべて満たすものではありません。ディレクトリ一覧の私の要件:

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

たくさんハッキングした後、私はついに私が満足しているワンライナーを思いついた(非常に長い行ではあるが;-))。これを '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オプションは "total"行を削除することです。ディレクトリの末尾のスラッシュを表示するために-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シェル間で一貫していること、および(2)重いUTF-8のオーバーヘッドがなくなるためより速いパフォーマンスが見られる場合処理する文字セット.

  • 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つのマイナーな欠点は、ファイル名を囲むカラーコントロール文字がソートをあまりにも信頼できなくするので、色付きのリストを作成できないことです。


UPDATE

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

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に頼る必要はありません。新しいエイリアスは前のエイリアスほど多くの情報を表示しませんが、パフォーマンスの向上はそれだけの価値があります。特典として、あなたは色も手に入れます!

5
thdoan

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

長いオプション:

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

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

 function lss 
 {
#先頭にディレクトリを付けてディレクトリ一覧を表示します。
 
 command ls --color = always $ @ | egrep '^ d | total' 
コマンドls --color = always $ @ | egrep -v '^ d | total'; 
} 
2
SuperMagic

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 ~)のエイリアスを使用できます。

また、lsへの各呼び出しは、grepコマンドにパイプされます。ここで、ソートが行われます。 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

ノート

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

別の方法 ...

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

OR

ls -la | sort -r

OR

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

これはスクリプトソリューションです。名前だけを、iノードデータを、アルファベット順で、大文字と小文字を区別せずに列にフォーマットします。それは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のデフォルト動作を別名設定または変更しないでください。

0
Igorio