bash – Unixで “ls “を使っているときに、ディレクトリを最初にソートしてからファイルなどをソートする方法

bash ls sorting unix

lsコマンドを使って、最初にディレクトリを表示して、次にファイルを表示するようにしたいと思います。試してみました

ls -la | sort -k 1

でも、順番を間違えてしまった

  99  atricapilla  2010-02-16


ベストアンサー

次のコマンドを実行すると、最初にディレクトリ、2番目に通常のファイル、3番目にリンクが一覧表示されます

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

また、キーストロークを保存するために、このコマンド用にaliasを作成するのは非常に理にかなっています

Edit:

ディレクトリを先に、そしてディレクトリ以外のものを後にしたい場合は、これを使用します

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

31  eleven81  2010-02-16


私は*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'

223  jonathanserafini  2010-02-16


mac ユーザーの場合、coreutils をインストールすることができます

この式は、GNUコアユーティリティの実装を提供し、macOSでも提供されているコマンドは、”g “という接頭辞を付けてインストールされています

brew install coreutils
gls --color -h --group-directories-first

別名でさらに生活をシンプルにすることができます

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

19  Vadym Tyemirov  2014-06-13


アルファベット順にするかどうかによって、いくつかの選択肢があります

あなたは単に試してみることができます

ls -al | sort -k1 -r

またはこれを使用して、同じパーミッションを持つファイルのアルファベット順を保持します

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

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

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

6  Studer  2010-02-16


私はディレクトリのリストで見たいと思う特定のものがあり、今のところ、ここでの答えのどれも以下のすべての要件を満たしていません。ディレクトリのリストのための私の要件

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

いろいろと調べてみた結果、ようやく納得のいく一文を思いついた(非常に長い行ではあるが ;-)。これを「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 -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df — ディレクトリを抽出し、ファイル名 (9列目) でソートし、非アルファ/スペース文字 (d オプション) と大文字小文字 (f オプション) の両方を無視する。ls -A オプションは、前のステップですでに抽出した ./../ をリストから除外します。私はすべての grep および sort コマンドの前に 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 のエイリアスの動作を見てみましょう!

BEFORE:

$ 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/

AFTER:

$ 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)

マイナーな欠点としては、ファイル名の周囲の色制御文字がソートを信頼性の低いものにしてしまうので、色付きのリストを持つことができないということがあります


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"}'

Sample output:

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

6  thdoan  2015-10-24


delerious010さんの回答に、旧態依然とした注文を希望するならば、それを付け加えておきます

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

(または “C “に設定されたLC_ALLまたはLANGUAGEまたはLC_COLLATEを使用する)

これで似たようなものが出てきます

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

しかし、私の記憶が正しければ、隠しドットファイルは元々ディレクトリの前に現れていました

5  Paused until further notice.  2010-02-16


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

function lss
{
# Shows directory listing with directories at the top.

command ls  --color=always $@ | egrep '^d|total'
command ls  --color=always $@ | egrep -v '^d|total';
}

2  SuperMagic  2010-02-16


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

Long options:

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

2  Bobby  2010-02-16


別の方法

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  2012-06-08


TL;DR

alias ls='ls -lhF --color'

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

alias ll=list_sorted

Explanation

私はここの回答やコメントにある解答を組み合わせて使っています

Default ls

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

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

Extended ll

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

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

最後に、ディレクトリでもファイルでもないもの(ディレクトリの内容の合計サイズを示す行でもないもの)を全て表示します。これは、directoy、通常のファイルエントリ、合計エントリをグレップし、-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 を呼び出すことで、常に ls コマンドを呼び出すことができます

alias ll=list_sorted

Notes

  • 私はコマンドの区切り文字として && の代わりに ; を使用しています。そうしないと、ディレクトリを含まないディレクトリの内容をリストアップすることができません (最初の ls コマンドは false と評価され、&& と結合されているため、次のコマンドの実行を許可しません。; はこれを回避しています)

1  kleinfreund  2017-06-22


これはスクリプトによる解決策です。名前だけをリストアップし、inode データを含まず、アルファベット順で、大文字小文字を区別せず、列にフォーマットします。ls のデフォルト出力のようにメジャー列ではなくメジャー行になっていますが。gt;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[@]}"

そしてもう一つは、いくつかの余分なフォーマットを追加したものです

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  2014-07-29


“一つのことをやって、それをうまくやる”

各パートを別々に解いて、最後に結合します。各サブコマンドを解くことは、プロセスの各部分を理解するのに役立ち、より良い開発者になるので、この答えを選択することを考慮してください

アルファベット順に並べたディレクトリの一覧です

ls -lp | grep "/"

隠しフォルダをアルファベット順に並べたディレクトリのリスト

ls -lap | grep "/"

アルファベット順に並べたファイルの一覧です

ls -lp | grep -v "/"

隠しフォルダをアルファベット順に並べたファイルのリスト

ls -lap | grep -v "/"

最初にディレクトリのリストを表示し、次にアルファベット順に並べたファイルを表示します

ls -lp | grep "/" && ls -lap | grep -v "/"

最初のディレクトリのリストは、非表示を示すアルファベット順にソートされたファイル

ls -lap | grep "/" && ls -lap | grep -v "/"

そしてもちろん、あなたが望むならば、後でこれを行うためのエイリアスを作成することができます

alias foldersThenFiles='ls -lap | grep "/" && ls -lap | grep -v "/"'

0  jasonleonhard  2020-02-19


タイトルとURLをコピーしました