UNIXクラスを始めたばかりで、さまざまなBashコマンドを学習しています。私たちの割り当てには、その下にいくつかのフォルダーがあるディレクトリでさまざまなコマンドを実行することが含まれます。
私は、ルートフォルダからすべての通常のファイルをリストしてカウントする方法を知っています:
find . -type l | wc -l
しかし、ディレクトリ全体で最大のファイルを見つけるために、そこからどこに行くべきかを知りたいです。 du
コマンドに関して何かを見たことがありますが、私たちはそれを学んでいないので、学んだことのレパートリーでは、何らかの方法でそれをls -t
コマンドに接続する必要があると思います。
そして、私の「専門用語」が正しくない場合はご容赦ください、私はまだそれに慣れています!
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」を使用します
現在のディレクトリとそのサブディレクトリで上位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
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
を再度実行できます)が、このアプローチを多少損ないます。
これは、ファイルが通常のファイルである場合、ファイルを再帰的にリストし、7番目のフィールド(find
出力のサイズです。自分のものを確認してください)でソートし、最初のファイルのみを表示します。
find . -type f -ls | sort +7 | head -1
find
の最初のオプションは、再帰検索の開始パスです。 -typeのf
は、通常のファイルを検索します。これをファイル名として解析しようとすると、ファイル名にスペース、改行、その他の特殊文字が含まれていると失敗する可能性があることに注意してください。 sort
のオプションもオペレーティングシステムによって異なります。 FreeBSDを使用しています。
「より良い」がより複雑で重いソリューションは、find
がディレクトリを走査することですが、おそらくstat
を使用してファイルの詳細を取得し、awk
を使用して最大サイズを見つけることができます。 stat
の出力もオペレーティングシステムに依存することに注意してください。
Linux/UNIX/BSDファイルシステムで最大のファイル/ディレクトリを見つけるための簡単なコマンドはありません。ただし、次の3つのコマンド(パイプを使用)の組み合わせにより、最大のファイルのリストを簡単に見つけることができます。
# du -a /var | sort -n -r | head -n 10
もっと人間が読める出力が必要な場合:
$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10
どこで、
これにより、現在の作業ディレクトリで最大のファイルまたはフォルダーが見つかります。
ls -S /path/to/folder | head -1
すべてのサブディレクトリで最大のファイルを見つけるには:
find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'
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
およびサブディレクトリで最大のファイルが見つかります。
次のコマンドを試してください:
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)
を移動すると、ディレクトリ内の最大のファイルが印刷されます。
次のワンライナーを試してください(上位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'
Linux Solution:たとえば、ファイル/フォルダーのサイズに従ってホーム(/)ディレクトリーのすべてのファイル/フォルダーのリストを表示したい場合(降順)。
須藤du -xm/|ソート-rn |もっと
du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1
または
du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'
このスクリプトは、さらなるアクションのために最大のファイルを見つけることを簡単にします。 〜/ 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
フォルダー内の大きなファイルを一覧表示するには
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
で最初の例を使用する必要があります。
ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'
それはそれを行うための非常に簡単な方法です:
ls -l | tr -s " " " " | cut -d " " -f 5,9 | sort -n -r | head -n 1***
そして、あなたはこれを得るでしょう:8445 examples.desktop