サイズに従って再帰的にファイルをソートする


78

フォルダー内で最大のファイルを見つける必要があります。
フォルダーを再帰的にスキャンし、コンテンツをサイズで並べ替えるにはどうすればよいですか?

を使用してみましたls -R -Sが、これはディレクトリもリストします。
私も使用してみましたfind


1
各サブディレクトリ内のファイルを個別に一覧表示しますか、それともどのサブディレクトリにあるかに関係なく、すべてのサブディレクトリ内のすべてのファイルを検索し、サイズ別に一覧表示しますか?また、「ディレクトリ」と「フォルダ」とはどういう意味ですか?さまざまなことを説明するためにそれらを使用しているようです。
テルドン

サブディレクトリのみを表示せずに、特定のディレクトリ内のファイルとそのサブディレクトリ内のファイルを一覧表示するだけだと言っていますか?質問をクリーンアップしてみてください。明確ではありません。
slm

回答:


92

また、これを行うこともできduます。念のため、このバージョンのdu次のものを使用しています。

$ du --version
du (GNU coreutils) 8.5

アプローチ:

$ du -ah ..DIR.. | grep -v "/$" | sort -rh

アプローチの内訳

このコマンドdu -ah DIRは、指定されたディレクトリ内のすべてのファイルとディレクトリのリストを生成しますDIR-h私が好む人間が読めるサイズを生成します。不要な場合は、そのスイッチをドロップします。head -6出力の量を制限するためだけに使用しています!

$ du -ah ~/Downloads/ | head -6
4.4M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020_WirelessFrames_exUG_GLB_en.pdf
624K    /home/saml/Downloads/kodak_W820_wireless_frame/easyshare_w820.pdf
4.9M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020WirelessFrameExUG_GLB_en.pdf
9.8M    /home/saml/Downloads/kodak_W820_wireless_frame
8.0K    /home/saml/Downloads/bugs.xls
604K    /home/saml/Downloads/netgear_gs724t/GS7xxT_HIG_5Jan10.pdf

最小から最大に並べ替えるのに十分簡単:

$ du -ah ~/Downloads/ | sort -h | head -6
0   /home/saml/Downloads/apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios/plugins/check_ldaps
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/translog/translog-1365292480753
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/translog/translog-1365292480946
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/2/index/write.lock

逆に、最大から最小へ:

$ du -ah ~/Downloads/ | sort -rh | head -6
10G /home/saml/Downloads/
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy

ディレクトリのみを表示せず、ファイルのみを表示します。

$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6 
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run

最小から最大のリストだけでなく、問題のある上位6つのファイルが必要な場合は、ソートスイッチを逆にして(-r)をドロップし、のtail -6代わりに使用できますhead -6

$ du -ah ~/Downloads/ | grep -v "/$" | sort -h | tail -6
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
1.5G    /home/saml/Downloads/digital_blasphemy
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
2.3G    /home/saml/Downloads/apps_archive
3.8G    /home/saml/Downloads/audible
3.8G    /home/saml/Downloads/audible/audio_books

14
grep -v "/$"ディレクトリにはスラッシュが追加されていないため、この部分は期待どおりに動作していないようです。結果からディレクトリを除外する方法を知っていますか?
ヤンワルチョウ

@JanekWarchol-どのバージョンのcoreutilsを使用していますか?
slm

8.13を使用しています。しかし、とにかく、あなたの答えの出力にも末尾/のs /home/saml/Downloads/audibleがありません。たとえば、ディレクトリのように見えますが、スラッシュはありません。/home/saml/Downloads/スラッシュしかありませんが、これはおそらく、initialの引数を指定するときにスラッシュで書いたためでしょうdu
ヤンワルチョウ

1
また、これはdirsのを見つけた
ekerner

1
これはファイルだけをリストするのではなく、ディレクトリもリストします:(
Roman Gaufman

20

現在のディレクトリとそのサブディレクトリ内のすべてのファイルを検索し、それらのサイズに応じて(パスを考慮せずに)リストし、ファイル名に改行文字が含まれないと仮定する場合、GNU findでこれを行うことができます:

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

man findGNUシステム上:

   -printf format
          True; print format  on  the  standard  output,
          interpreting  `\'  escapes and `%' directives.
          Field widths and precisions can  be  specified
          as  with the `printf' C function.  Please note
          that many of the  fields  are  printed  as  %s
          rather  than  %d, and this may mean that flags
          don't work as you  might  expect.   This  also
          means  that  the `-' flag does work (it forces
          fields to be  left-aligned).   Unlike  -print,
          -printf  does  not add a newline at the end of
          the string.  The escapes and directives are:

          %p     File's name.
          %s     File's size in bytes.

からman sort

   -n, --numeric-sort
          compare according to string numerical value

残念ながらMacでは機能しません。次のように表示されます:find:-printf:不明なプライマリまたは演算子
ローマンガフマン

@RomanGaufmanはい、だからこそ答えはGNU findを指定してます。GNUツールをMacにインストールすると、そこでも動作します。
テルドン

11

次のコマンドを試してください。

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

現在のディレクトリ内の上位20個のファイルを再帰的に一覧表示します。

注意:オプション-hのためにはsort、インストールするしましたので、OSX / BSDでは使用できませんsortからcoreutils(例えば経由brew)とローカルbinパスを適用しPATH、例えば

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

または、次を使用します。

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

最大のディレクトリを使用するにはdu、たとえば:

du -ah . | sort -rh | head -20

または:

du -a . | sort -rn | head -20

3
完璧です、これはMacで動作し、ディレクトリを表示しない最初のソリューションです:)-ありがとうございます!
ローマンガフマン

行数> = Xのファイルのみを表示するフィルター (例:X = 0)
マトリックス

7

これにより、すべてのファイルが再帰的に検索され、サイズで並べ替えられます。すべてのファイルサイズをkbで出力し、切り捨てて0 KBのファイルが表示される場合がありますが、使用するには十分であり、OSXで動作します。

find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1


Ubuntu 14.04でも機能しました!
デビッドラム

これはファイルだけではなくディレクトリをリストします:(
Roman Gaufman

@RomanGaufman-フィードバックをありがとう!私のテストから、find . -type fそれはあなたは正しい、再帰的に動作します...ファイルを見つけたが、それはそれは見つかったすべてのファイル、自分自身ではないディレクトリの一覧表示
ブラッド・パークス

Xargsは1980年代に使用されました。1989年にexecplusがDavid Kornによって導入されて以来、これは悪い考えです。
気味悪い

5

を使用するとzsh、(ls -lディスク使用量ではなく、出力のサイズ列のような見かけ上のサイズに関して)最大のファイルが見つかります:

ls -ld -- **/*(DOL[1])

最大の6つの場合:

ls -ld -- **/*(DOL[1,6])

それらをファイルサイズでソートするには、ls-Sオプションを使用できます。一部のls実装には、リストをソート-Ulsないオプションもあります(リストはすでにサイズでソートされてzshいるため)。


3

ディレクトリをスキップするMac / Linuxのシンプルなソリューション:

find . -type f -exec du -h {} \; | sort -h

2

で同等BSDもしくはOSXれます

$ du -ah simpl | sort -dr | head -6

0

これは、さまざまな理由で非常によく知られたニーズであり(ディレクトリで最新のバックアップを見つけるのが好きです)、驚くほど単純なタスクです。

find、xargs、stat、tail、awk、およびsortユーティリティを使用するLinuxソリューションを提供します。

ほとんどの人はいくつかのユニークな答えを提供しましたが、ファイル名を適切に処理し、ユースケースを簡単に変更できるため(統計の変更、引数の並べ替え)

また、Windowsでもこの機能を使用できるPythonソリューションを提供します

Linuxコマンドラインソリューション

ディレクトリからファイルのみのリスト全体を再帰的に返し、ファイルサイズでソートします

find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n

前と同じですが、今回は最大のファイルを返します。

# Each utility is split on a new line to help 
# visualize the concept of transforming our data in a stream
find . -type f -print0 | 
xargs -0 -I{} stat -c '%s %n' {} | 
sort -n | 
tail -n 1 |
awk '{print $2}'

まったく同じパターンですが、最大サイズではなく最新のファイルを選択するようになりました

# (Notice only the first argument of stat changed for new functionality!)
find . -type f -print0 | xargs -0 -I{} stat -c '%Y %n' {} | 
sort -n | tail -n 1 | awk '{print $2}'

説明:

  1. find:現在のディレクトリからすべてのファイルを再帰的に検索し、それらをヌル文字で出力します
  2. xargs:標準入力から提供される引数を使用してコマンドを実行するユーティリティ。出力のすべての行に対して、そのファイルでstatユーティリティを実行します
  3. stat:Statは、非常に多くのユースケースを持つ素晴らしいコマンドです。2列を印刷しています。最初の列はブロックサイズ(%s)で、2番目の列はファイル名(%n)です
  4. sort:数値スイッチで結果をソートします。最初の引数は整数であるため、結果は適切にソートされます
  5. tail:出力の最後の行のみを選択します(リストがソートされているため、これが最大のファイルです!)
  6. awk:2番目の列を選択します。これには、ファイル名が含まれ、再帰ディレクトリ内で最大のファイルです。

Pythonソリューション

#!/usr/bin/env python
import os, sys
files = list()
for dirpath, dirname, filenames in os.walk(sys.argv[1]):
    for filename in filenames:
        realpath = os.path.join(dirpath, filename)
        files.append(realpath)
files_sorted_by_size = sorted(files, key = lambda x: os.stat(x).st_size)
largest_file = files_sorted_by_size[-1]
print(largest_file)

このスクリプトの説明には少し時間がかかりますが、基本的にスクリプトとして保存すると、コマンドラインで指定された最初の引数を検索し、そのディレクトリで最大のファイルを返します。このスクリプトはエラーチェックを行いませんが、Pythonでこれにアプローチする方法のアイデアを提供するはずです。これにより、この問題を解決するプラットフォームに依存しない素晴らしい方法が得られます。



0

次のコマンドを並べ替えオプションで試して、サイズが昇順のフォルダーを作成します

du -sh * | sort -sh


-1

AIXおよびHP-UXを除くすべてのプラットフォームで動作するものは次のとおりです。

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