ソートを使用したサブフォルダーの内容を含むディレクトリ内のファイルのリスト


9

サブフォルダーの内容を含むディレクトリの内容全体を一覧表示しようとしていますが、ファイルサイズで並べ替えています。これまでのところ、再帰的にリストと並べ替えを行うことができました(ファイルサイズを取得できる限りls -lhSR、これhは便利ですが、私にとっては必須ではありません)。私は明らかなことを見落としている、または不可能を尋ねているようですが、ここでのアドバイスは大歓迎です。

回答:


15

あなたは見つけることができます:

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)

完璧だ!本当にありがとうございました。これはまさに私が必要とするものでした!
トム

3
私の答えがあなたを助けてくれてうれしいです。左側のチェックマークをクリックして、回答を承認済みにすることを検討してください。ありがとう。
pLumo

1
@RoVo質問に賛成票を投じるのも良いことです。なぜなら、あなたがそれに答えたとすれば、あなたはおそらくそれが面白くて便利だと思ったからです。
terdon 2018年

これは確かに真実であり、私はこれを今やった;-)
pLumo

@toms答えがこれで良い場合でも、しばらく(おそらく1日程度)待ってから回答を受け入れてもかまいません。いったん答えが受け入れられると、別の答えがさらに良くなる方法はありません。そのため、多くの人が他の回答を投稿することをためらうことがないので、私たちはそれらを見て、どちらが良いかを知る機会がありません。
モンティハーダー

7

特定のシェルを指定しなかったので、zshのglob修飾子を使用する別の方法を次に示します

setopt extendedglob

再帰のために。次に例:

  1. プレーンファイルを再帰的に一覧表示します。

    printf '%s\n' **/*(.)
  2. 再帰的にリストプレーンファイル、oをによってrdered しわLの ength(すなわちサイズ):

    printf '%s\n' **/*(.oL)
  3. 再帰的にリストプレーンファイルは、Oはでrdered 折り目サイズ:

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

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

ファイルサイズも必要な場合は、次を使用できます

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

4

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

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

ファイル数が多すぎると、「引数リストが長すぎます」というエラーが発生します。それを回避するには、printfand を使用できます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

素晴らしい解決策。検索と比較して、それは隠しファイルを含みません、それを達成する方法は?
pLumo

@RoVo常にこれらのことを忘れてください– dotglobシェルオプションを設定する必要があるだけです。私の最新の回答を参照してください。
デザート

sedを使用した後でディレクトリをprintf "%s\0" **/* | xargs -0 sh -c 'for f; do [ -d "$f" ] || stat -c "%s %n" "$f"; done' sh | sort -n
削除する

ls -lhSd **/*リストの一部としてディレクトリを使用してもかまわない場合に使用できます。または、ディレクトリ名が含ま.れておらず、必要なすべてのファイルが含まれている場合、できますll -hS **/*.*
Peter Cordes


3

zshがない場合でも、du+を使用できますsort

  1. ディレクトリの累積サイズを含む、人間が読めるサイズ:

    du --apparent-size -ah0 . | sort -zh | xargs -0L1
    
  2. ファイルのみ(を使用find):

    find . -type f -print0 |
      du --files0-from=- --apparent-size -ah0 |
      sort -zh |
      xargs -0L1
    

どちらの場合も、私はnullで終わるライン(使用することを選択した-0-z-print0すべての有効なファイル名に対して安全であることを、オプション)。


0

大きすぎないディレクトリツリーでインタラクティブにすばやく使用するshopt -s globstarは、本当に便利です。グロブは、タイプに基づいてディレクトリを除外することはできませんが、あなたがそれを使用する場合ls -d、その後lsだけではなく、内容の、ディレクトリ名を表示します。

あなたのllエイリアスが含まれていると仮定します-lh

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

このような出力(私のコードゴルフディレクトリから)が得られますが、色で強調表示されます(ディレクトリが見やすくなります)。ファイルサイズによるソートはサブディレクトリ間で発生したことに注意してください。

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つのlsコマンドラインに収まらない場合は、並べ替え可能なfind -exec ls {} +コマンドラインにすべてを配置しlsます。

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

-not -type d代わりに-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-sortdu -hプリントのようにサイズのサフィックスが付いた数値をソートします。での使用に最適ですdu

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

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

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

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