サブフォルダの内容を含むディレクトリ内のファイルをソートして一覧表示する

サブフォルダの内容を含むディレクトリ内のファイルをソートして一覧表示する

サブフォルダの内容を含むディレクトリの内容全体をリストし、ファイルサイズ順に並べ替えたいと考えています。 これまでのところ、 を使って再帰的にリストと並べ替えを行うところまでたどり着きましたls -lhSR( はhあれば便利ですが、ファイルサイズを取得できる限り、私にとっては絶対に必須ではありません)。 明らかなことを見落としているか、不可能なことを要求している可能性がありますが、アドバイスをいただければ幸いです。

答え1

find を使用できます:

find . -type f -printf "%s %P\n" | sort -n

オプション: バイト値を人間が読める形式に変換するには、以下を追加します。

| numfmt --to=iec-i --field=1

説明:

 find in current directory (.) all files (-type f) 

 -printf: suppress normal output and print the following:
     %s - size in bytes
     %P - path to file
     \n - new line

 | sort -n: sort the result (-n = numeric)

答え2

特定のシェルを指定していないので、zshのglob修飾子を使用する代替案があります。

setopt extendedglob

再帰の場合、例えば次のようになります。

  1. プレーンファイルを再帰的にリストします:

    printf '%s\n' **/*(.)
    
  2. プレーンファイルを再帰的にリストするo注文者折り目長さ(サイズ):

    printf '%s\n' **/*(.oL)
    
  3. プレーンファイルを再帰的にリストする注文者折り目サイズ:

    printf '%s\n' **/*(.OL)
    
  4. プレーンファイルを再帰的にリストし、サイズの降順で並べ、上位 3 つの結果を選択します。

    printf '%s\n' **/*(.OL[1,3])
    

ファイルサイズも知りたい場合は、

du -hb **/*(.OL[1,3])

答え3

シェル オプションを設定すると、globstarシェル グロブを使用できます。

shopt -s globstar         # don’t match hidden files
shopt -s globstar dotglob # match hidden files
stat -c"%s %n" **/* | sort -n

ファイルが多すぎる場合にこれを実行すると、「引数リストが長すぎます」というエラーが発生します。これを回避するには、 および を使用しprintfますxargs

printf "%s\0" **/* | xargs -0 stat -c"%s %n" | sort -n

これによってディレクトリ (サイズは 4096 バイト) も印刷されることに気付きました。これを望まない場合は、代わりにこれを使用してください。

stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
printf "%s\0" **/* | xargs -0 stat -c"%A %s %n" | sed '/^d/d;s/\S* //' | sort -n

実行例

$ tree
.
├── edits.png
├── makescript
├── new
│   └── edits.png
└── test
    └── 1.png

2 directories, 4 files
$ stat -c"%s %n" **/* | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
4096 new
4096 test
$ stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png

答え4

素早くインタラクティブに使用あまり大きくないディレクトリツリーでは、shopt -s globstar本当に素晴らしいです。 glob はタイプに基づいてディレクトリをフィルタリングすることはできませんが、 と併用すると、ls -d内容lsではなくディレクトリ名だけが出力されます。

llエイリアスに以下が含まれていると仮定します-lh:

  # with  shopt -s globstar   in your .bashrc
ll -rSd **/*

次のような出力が得られます (私の code-golf ディレクトリから)。ただし、色で強調表示されます (ディレクトリが見やすくなります)。ファイル サイズによる並べ替えはサブディレクトリ全体で行われていることに注意してください。

drwxr-xr-x 1 peter peter   70 Jun  8 07:56 casexchg
...
drwxr-xr-x 1 peter peter  342 Mar 13 18:47 parity-party
-rw-r--r-- 1 peter peter  387 Jul 29  2017 likely.cpp
-rw-r--r-- 1 peter peter  416 Aug 31  2017 true-binary.asm~
-rw-r--r-- 1 peter peter  447 Feb 23 20:14 weight-of-zero.asm
...
-rw-r--r-- 1 peter peter 6.4K Jun  1  2017 string-exponential.asm
-rwxr-xr-x 1 peter peter 6.7K Aug 31  2017 true-binary
-rwxr-xr-x 1 peter peter 6.8K Sep 17  2017 dizzy-integer
-rw-r--r-- 1 peter peter 7.5K Jul 24  2017 fibonacci/fibonacci-1G.v3-working-32b-stack-except-output.asm
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G~
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G
-rwxr-xr-x 1 peter peter 8.4K May 19 04:29 a.out
-rw-r--r-- 1 peter peter 8.9K Jul 25  2017 fibonacci/perf.python-xnor-2n
-rw-r--r-- 1 peter peter 9.5K Jul 26  2017 fibonacci/fibonacci-1G-performance.asm
-rwxr-xr-x 1 peter peter 9.6K Apr 12 23:25 empty-args
-rw-r--r-- 1 peter peter 9.7K Dec 18 17:00 bubblesort.asm
-rwxr-xr-x 1 peter peter 9.9K Feb  6 23:34 parity-party/a.out
-rw-r--r-- 1 peter peter 9.9K Jul 25  2017 fibonacci/fibonacci-1G-performance.asm~
...

パイプでディレクトリをフィルタリングすることができますgrep -v '^d'

ファイル名にパターンがある場合は、ディレクトリではなくファイルのみに一致するグロブを使用できる場合があります。たとえばll -rSd **/*.jpg**/*.*ディレクトリ名にパターンが.含まれていない場合や、必要なすべてのファイルがする

(DOS の経験がある人向け: Unix では魔法のようなことは何もありません*.*。リテラル ドットを含むディレクトリ エントリに一致するだけです。ただし、実行可能ファイルや場合によってはテキスト ファイル以外では、ファイル名に拡張子を付けるのがよく行われます。)

@dessertは、shopt -s dotglob一致させる必要があると指摘しています全てファイル。


GNUでfind

1 つのコマンド ラインに収まるほど多くのファイルがない場合lsfind -exec ls {} +それらをすべて 1 つのコマンド ラインに配置してls並べ替えることができます。

find -not -type d -exec ls --color -lrSh {} +

-not -type dinstead ofを使用すると-type f、シンボリックリンク、名前付きパイプ、ソケット、デバイス ファイル、およびディレクトリ内にあるその他のものを無視することがなくなります。


du

du -ach | sort -h
....
4.0K    x86-modedetect-polyglot.o
8.0K    ascii-compress-base.asm
8.0K    dizzy-integer
8.0K    stopwatch-rdtsc.asm
8.0K    string-exponential.asm
8.0K    true-binary
12K     a.out
12K     bubblesort.asm
12K     casexchg
12K     empty-args
100K    parity-party
220K    fibonacci
628K    total

現在、ディレクトリ名は、そのすべての内容の合計に基づいてリストに分類されていますが、個々のファイルは引き続き含まれています。

sort -h、別名 は--human-numeric-sort、プリントのようにサイズ接尾辞付きの数値をソートしますdu -h。 と一緒に使用すると最適ですdu

ディレクトリのみを取得するにはdu -sch * | sort -h、 、 または をよく使用します。*/

du -sch **/* | sort -hduオプションがあることを忘れた場合は、上記の出力が表示されます-a

(私は回答を投稿しているので、時間をかけて調べただけです。インタラクティブな使用には、おそらく を使用したでしょうdu -sch **/*

関連情報