出力には、ディレクトリ名、ファイル名、ファイルサイズが含まれます。コマンドが実行される各ディレクトリに1つ(最大ファイル)があります。
可能であれば、そのディレクトリにあるファイルの平均サイズも教えてください。
目的は、ディレクトリ内の他のファイルよりもはるかに大きいファイルをディレクトリ内で見つけて置き換えることを可能にすることです。
答え1
GNU find
、sort
およびsed
(4.2.2以降)を使用してファイルサイズで一度並べ替え、ディレクトリパスで並べ替えます。
find /some/dir -type f -printf '%s %f%h\0' |
sort -zrn |
sort -zut/ -k2 |
sed -zre 's: ([^/]*)(/.*): \2/\1:'
説明する:
- ファイルサイズ、名前、パス(最初はスペースで区切り、最後の2つはスペースで区切り
/
)を印刷し、各エントリはASCII NUL文字で終わります。 - 次に、NULで区切られた出力を想定し、サイズを使用して数値ソートを実行します(逆順で最大のファイルが最初に表示されます)。
- 次に、2番目に区切られたフィールド(ファイルを含むディレクトリへのパス)のすべての項目を使用して、最初の
sort
一意の項目のみを印刷します。/
- その後、
sed
ディレクトリとファイルの名前を変更して通常のパスを取得します。
読み取り可能な出力を取得するには、ASCII NULを改行文字に置き換えます。
find /some/dir -type f -printf '%s %f%h\0' |
sort -zrn |
sort -zut/ -k2 |
sed -zre 's: ([^/]*)(/.*): \2/\1:' |
tr '\0' '\n'
出力例:
$ find /var/log -type f -printf '%s %f%h\0' | sort -zrn | sort -zt/ -uk2 | sed -zre 's: ([^/]*)(/.*): \2/\1:' | tr '\0' '\n'
3090885 /var/log/syslog.1
39789 /var/log/apt/term.log
3968 /var/log/cups/access_log.1
31 /var/log/fsck/checkroot
467020 /var/log/installer/initial-status.gz
44636 /var/log/lightdm/seat0-greeter.log
15149 /var/log/lxd/lxd.log
4932 /var/log/snort/snort.log
3232 /var/log/unattended-upgrades/unattended-upgrades-dpkg.log
答え2
平均は、以下を組み合わせて計算することもfind
できますawk
。
find . -type f -printf '%s %h/%f\0'|awk 'BEGIN { RS="\0" } { SIZE=$1; for (i = 1; i <= NF - 1; i++) $i = $(i + 1); NF = NF - 1; DIR=$0; gsub("/[^/]+$", "", DIR); FILE=substr($0, length(DIR) + 2); SUMSIZES[DIR] += SIZE; NBFILES[DIR]++; if (SIZE > MAXSIZE[DIR] || !BIGGESTFILE[DIR]) { MAXSIZE[DIR] = SIZE; BIGGESTFILE[DIR] = FILE } }; END { for (DIR in SUMSIZES) { printf "%s: average %f, biggest file %s %d\n", DIR, SUMSIZES[DIR] / NBFILES[DIR], BIGGESTFILE[DIR], MAXSIZE[DIR] } }'
より読みやすい方法で配置されたAWKスクリプト:
BEGIN { RS="\0" }
{
SIZE=$1
for (i = 1; i <= NF - 1; i++) $i = $(i + 1)
NF = NF - 1
DIR=$0
gsub("/[^/]+$", "", DIR)
FILE=substr($0, length(DIR) + 2)
SUMSIZES[DIR] += SIZE
NBFILES[DIR]++
if (SIZE > MAXSIZE[DIR] || !BIGGESTFILE[DIR]) {
MAXSIZE[DIR] = SIZE
BIGGESTFILE[DIR] = FILE
}
}
END {
for (DIR in SUMSIZES) {
printf "%s: average %f, biggest file %s %d\n", DIR, SUMSIZES[DIR] / NBFILES[DIR], BIGGESTFILE[DIR], MAXSIZE[DIR]
}
}
これには、nullで区切られた入力レコードが必要です。ムルの答え) 各入力レコードについて
- 保存サイズ(後で使用するため)
- パスの最初の文字の前にあるすべてのエントリを削除します(少なくともスペースを含むファイル名を正しく処理するには)。
- ディレクトリ抽出、
- ファイル名の抽出、
- 以前に保存したサイズをディレクトリの合計サイズに追加します。
- ディレクトリ内のファイル数を増やします(平均を計算できるように)。
- サイズが保存されているディレクトリの最大サイズより大きい場合、またはディレクトリにまだファイルが表示されていない場合は、最大のファイルに関する情報を更新してください。
すべての操作が完了すると、スクリプトは入力キーを繰り返してディレクトリSUMSIZES
、平均サイズ、最大ファイル名、サイズを出力します。
出力をパイプしてディレクトリsort
名でソートできます。人間に馴染みのある形式で寸法の形式をさらに指定するには、線をprintf
次のように変更できます。
printf "%.2f %d %s: %s\n", SUMSIZES[DIR] / NBFILES[DIR], MAXSIZE[DIR], DIR, BIGGESTFILE[DIR]
その後、出力はにパイプされますnumfmt --field=1,2 --to=iec
。結果をディレクトリ名でソートでき、3番目のフィールドからソートを開始できますsort -k3
。
答え3
ジッシュ~のワイルドカードパターンあなたがやっていることに非常に便利です。具体的には、zsh はタイプ、サイズなどの属性に基づいてファイルを照合できます。グローバル予選。 Glob修飾子を使用して一致を並べ替えることもできます。
たとえば、zsh では、*(.DOLN[1])
現在のディレクトリで最大のファイル名に展開されます。*
ファイル名パターン(シェルオプションに応じて可能なドットファイルを除くすべてのものと一致)。修飾子は、.
一致するファイルを通常のファイルに制限し、ドットファイルを含め、D
サイズを縮小する順序(「長さ」)で並べ替えるか、一致するファイルがまったくない場合は拡張子を空にして最初の一致のみを選択します。*
OL
N
[1]
ディレクトリを再帰的に列挙できます**/
。たとえば、次のループは、現在のディレクトリとそのサブディレクトリのすべてのサブディレクトリを繰り返し繰り返します。
for d in **/*(/); do … done
あなたはそれを使用することができますzstat
他の解析ツールを使用せずにファイルサイズやその他のメタデータにアクセスできます。
zmodload -F zsh/stat b:zstat
files=(*(DNoL))
zstat -A sizes +size -- $files
total=0; for s in $sizes; do total+=$s; done
if ((#sizes > 0)); then
max=$sizes[-1]
average=$((total/#sizes))
median=$sizes[$((#sizes/2))]
fi
答え4
Baobabまたはいくつかの同様のソフトウェアを試してください。そのうちの1つ以上をディストリビューションに含めることができます。彼らは問題のカタログを可視化することをすばらしく行います。
- バオバブの木
- JDiskレポート
- NCDU
- K4DirStat
- QDirStat
- 広東省の地図
http://alternativeto.net/software/baobab/?platform=linux
Baobabのマニュアルページでは、これがどのように機能するかを説明しています。
$> man baobab
BAOBAB(1)
NAME
Baobab - A graphical tool to analyse disk usage
SYNOPSIS
baobab [directory]
DESCRIPTION
baobab is able to scan either specific folders or the whole filesys-
tem (local and remote), in order to give the user a graphical tree
representation including each directory size or percentage in the
branch. It also auto-detects in real-time any change made to your
home directory as far as any mounted/unmounted device. A graphical
treemap window is also provided for any selected folder.
A detailed documentation on the program could be read at:
http://www.gnome.org/projects/baobab
AUTHOR
Fabio MARZOCCA <[email protected]>
BAOBAB(1)