web-dev-qa-db-ja.com

Bash-ディレクトリとそのサブディレクトリで最大のファイルを見つける方法

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

私は、ルートフォルダからすべての通常のファイルをリストしてカウントする方法を知っています:

find . -type l | wc -l

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

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

94
Rekson

this link-からの引用

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

$ find . -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

**上のXの最大ファイル(上記のすべての例)を印刷するには、上の「head」だけではなく「head -n X」を使用します

118
tamsler

現在のディレクトリとそのサブディレクトリで上位25ファイルを見つけるには:

find . -type f -exec ls -al {} \; | sort -nr -k5 | head -n 25

これは、「sort -nr -k5」パイプコマンドを使用してファイルのサイズに基づいてソートすることにより、上位25ファイルを出力します。

同じですが、人間が読めるファイルサイズを使用しています:

find . -type f -exec ls -alh {} \; | sort -hr -k5 | head -n 25

58
xpros
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が複数回実行されるため、多数のファイルがあるディレクトリで実行すると失敗する可能性があります。それは乗り越えられない問題ではありません(各ls呼び出しからhead -n 1出力を収集し、単一のファイルができるまでループしてls -Sを再度実行できます)が、このアプローチを多少損ないます。

10
nneonneo

これは、ファイルが通常のファイルである場合、ファイルを再帰的にリストし、7番目のフィールド(find出力のサイズです。自分のものを確認してください)でソートし、最初のファイルのみを表示します。

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

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

「より良い」がより複雑で重いソリューションは、findがディレクトリを走査することですが、おそらくstatを使用してファイルの詳細を取得し、awkを使用して最大サイズを見つけることができます。 statの出力もオペレーティングシステムに依存することに注意してください。

8
ghoti

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 command -h option:人間が読める形式でサイズを表示します(1K、234M、2Gなど)。
  • du command -s option:各引数の合計のみを表示します(要約)。
  • du command -x option:異なるファイルシステム上のディレクトリをスキップします。
  • sort command -r option:比較の結果を逆にします。
  • sortコマンド-hオプション:人間が読める数字を比較します。これは、GNUソート固有のオプションのみです。
  • head command -10 OR -n 10 option:最初の10行を表示します。
7
Kalpana

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

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

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

find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'
6
Steve

Solarisでは次を使用します。

find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

または

find . -type f -ls | sort -nrk7 | head -1 #unformatted

ここに投稿された他のものは機能しなかったためです。これにより、$PWDおよびサブディレクトリで最大のファイルが見つかります。

3
rindeal

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

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)を移動すると、ディレクトリ内の最大のファイルが印刷されます。

2
zjhui

次のワンライナーを試してください(上位20個の最大ファイルを表示)。

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

または(人間が読めるサイズ):

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

Findの-printfオプションはOSX/BSDには存在せず、statにはOSに応じて異なるパラメーターがあるため、Linux/BSD/OSXでは他の回答と比較して正常に動作します。ただし、OSX/BSDで適切に機能する2番目のコマンド(sortには-hがないため)、sortからcoreutilsをインストールするか、lsから-hを削除して、代わりにsort -nrを使用します。

したがって、これらのエイリアスはrcファイルに含めると便利です。

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'
2
kenorb

Linux Solution:たとえば、ファイル/フォルダーのサイズに従ってホーム(/)ディレクトリーのすべてのファイル/フォルダーのリストを表示したい場合(降順)。

須藤du -xm/|ソート-rn |もっと

1
Monir

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

または

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

1
Ansgar Wiechers

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

#!/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
0
jlettvin

フォルダー内の大きなファイルを一覧表示するには

ls -sh /pathFolder | sort -rh | head -n 1

ls -shの出力は、サイズがsおよび人間が理解できるファイルサイズ番号のhビューです。

ls -shS /pathFolder | head -n 1を使用できます。 Sの大きいlsは、リストを大きいファイルから小さいファイルに既に並べていますが、最初の結果はそのフォルダー内のすべてのファイルの合計になります。そのため、1つのファイルで1つの大きなファイルをリストする場合は、head -n 2で「2行目の結果」を確認するか、ls sort headで最初の例を使用する必要があります。

0
José Pacheco
ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'
0
Borislav Markov

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

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

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