112

UNIX クラスを始めたばかりで、さまざまな Bash コマンドを学習しています。私たちの課題には、その下にもいくつかのフォルダーがあるディレクトリに対してさまざまなコマンドを実行することが含まれます。

次を使用して、ルートフォルダーからすべての通常のファイルを一覧表示およびカウントする方法を知っています。

find . -type l | wc -l

しかし、ディレクトリ全体で最大のファイルを見つけるために、そこからどこに行くべきか知りたいです。コマンドに関して何かを見たことduがありますが、それを学んでいないので、私たちが学んだことのレパートリーで、何らかの方法でls -tコマンドに接続する必要があると思います.

そして、私の「専門用語」が正しくない場合はご容赦ください。私はまだそれに慣れています!

4

16 に答える 16

131

このリンクからの引用-

特定のディレクトリとそのサブディレクトリ内の上位 10 個のファイル名 (ディレクトリではない) を検索して出力する場合

$ find . -type f -printf '%s %p\n'|sort -nr|head

検索を現在のディレクトリに制限するには、find で「-maxdepth 1」を使用します。

$ find . -maxdepth 1 -printf '%s %p\n'|sort -nr|head

そして、上位 10 個の最大の「ファイルとディレクトリ」を出力するには:

$ du -a . | sort -nr | head

** 上記の唯一の「head」の代わりに「head -n X」を使用して、上位 X 個の最大ファイルを出力します (上記のすべての例で)

于 2012-09-20T23:21:11.683 に答える
10

Linux/UNIX/BSD ファイルシステムで最大のファイル/ディレクトリを見つけるための簡単なコマンドはありません。ただし、次の 3 つのコマンドを (パイプを使用して) 組み合わせると、最大のファイルのリストを簡単に見つけることができます。

# du -a /var | sort -n -r | head -n 10

より人間が読める出力が必要な場合は、次を試してください。

$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10

どこ、

  • Varは、検索するディレクトリです
  • du コマンド -h オプション :人間が読める形式の表示サイズ (例: 1K、234M、2G)。
  • du コマンド -s オプション :各引数の合計のみを表示します (概要)。
  • du コマンド -x オプション :異なるファイル システムのディレクトリをスキップします。
  • sort コマンド -r オプション :比較結果を反転します。
  • sort コマンドの -h オプション :人間が読める数値を比較します。これは GNU ソート固有のオプションのみです。
  • head コマンド -10 または -n 10 オプション :最初の 10 行を表示します。
于 2014-05-26T09:34:26.173 に答える
10
find . -type f | xargs ls -lS | head -n 1

出力

-rw-r--r--  1 nneonneo  staff  9274991 Apr 11 02:29 ./devel/misc/test.out

ファイル名だけが必要な場合:

find . -type f | xargs ls -1S | head -n 1

これにより、使用が回避awkされ、 で必要なフラグを使用できるようになりますls

警告xargs過度に長いコマンド ラインの作成を回避しようとするため、多くのファイルを含むディレクトリで実行すると、複数回実行されるため、失敗する可能性がありますls。これは克服できない問題ではありません (呼び出しhead -n 1ごとに出力を収集し、再度実行して、単一のファイルができるまでループすることができます) が、このアプローチをやや損なうものです。lsls -S

于 2012-09-21T03:45:03.397 に答える
9

通常のファイルの場合、これはファイルを再帰的にリストし、7 番目のフィールド (私のfind出力ではサイズです。あなたのものを確認してください) で並べ替え、最初のファイルだけを表示します。

find . -type f -ls | sort +7 | head -1

最初のオプションfindは、再帰検索の開始パスです。通常のファイルの のタイプのf検索。これをファイル名として解析しようとすると、ファイル名にスペース、改行、またはその他の特殊文字が含まれていると失敗する可能性があることに注意してください。オプションsortもオペレーティング システムによって異なります。FreeBSD を使用しています。

「より良い」が、より複雑で重い解決策はfind、ディレクトリをトラバースすることstatですが、おそらくファイルに関する詳細を取得するために使用し、次におそらく使用awkして最大サイズを見つけることです。statの出力は、オペレーティング システムによっても異なることに注意してください。

于 2012-09-20T23:20:50.657 に答える
6

これにより、現在の作業ディレクトリで最大のファイルまたはフォルダーが見つかります。

ls -S /path/to/folder | head -1

すべてのサブディレクトリで最大のファイルを見つけるには:

find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'
于 2012-09-20T23:21:01.660 に答える
2

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

find /your/path -printf "%k %p\n" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 1 

これにより、最大のファイル名とサイズ、および 500M を超えるサイズが出力されます。を移動するif($1 > 500000)と、ディレクトリ内の最大のファイルが出力されます。

于 2012-09-21T03:23:36.600 に答える
1

du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1

また

du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'

于 2012-09-20T23:33:06.723 に答える
1

このコマンドは私にとってはうまくいきます、

find /path/to/dir -type f -exec du -h '{}' + | sort -hr | head -10

人間が読めるモードで、サイズ順に上位 10 個のファイルを一覧表示します。

于 2021-07-26T19:07:15.210 に答える
0

このスクリプトは、さらなるアクションのために最大のファイルを見つけることを簡素化します。~/bin ディレクトリに保管し、~/bin を $PATH に入れます。

#!/usr/bin/env bash
# scriptname: above
# author: Jonathan D. Lettvin, 201401220235

# This finds files of size >= $1 (format ${count}[K|M|G|T], default 10G)
# using a reliable version-independent bash hash to relax find's -size syntax.
# Specifying size using 'T' for Terabytes is supported.
# Output size has units (K|M|G|T) in the left hand output column.

# Example:
#   ubuntu12.04$ above 1T
#   128T /proc/core

# http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash
# Inspiration for hasch: thanks Adam Katz, Oct 18 2012 00:39
function hasch() { local hasch=`echo "$1" | cksum`; echo "${hasch//[!0-9]}"; }
function usage() { echo "Usage: $0 [{count}{k|K|m|M|g|G|t|T}"; exit 1; }
function arg1() {
    # Translate single arg (if present) into format usable by find.
    count=10; units=G;  # Default find -size argument to 10G.
    size=${count}${units}
    if [ -n "$1" ]; then
        for P in TT tT GG gG MM mM Kk kk; do xlat[`hasch ${P:0:1}`]="${P:1:1}"; done
        units=${xlat[`hasch ${1:(-1)}`]}; count=${1:0:(-1)}
        test -n "$units" || usage
        test -x $(echo "$count" | sed s/[0-9]//g) || usage
        if [ "$units" == "T" ]; then units="G"; let count=$count*1024; fi
        size=${count}${units}
    fi
}
function main() {
    sudo \
        find / -type f -size +$size -exec ls -lh {} \; 2>/dev/null | \
        awk '{ N=$5; fn=$9; for(i=10;i<=NF;i++){fn=fn" "$i};print N " " fn }'
}

arg1 $1
main $size
于 2014-01-22T07:41:24.897 に答える
0
ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'
于 2019-01-11T16:34:22.470 に答える
0

それはそれを行うための非常に簡単な方法です:

ls -l | tr -s " " " " | cut -d " " -f 5,9 | sort -n -r | head -n 1***

そして、あなたはこれを得るでしょう:8445 examples.desktop

于 2014-03-14T07:40:40.450 に答える