最大、最小、平均ファイルサイズとそのパスを知りたいです。ディレクトリに同じファイル(15kb、15kbなど)が含まれている場合は、両方のファイルのパスとファイルサイズを同時に表示する必要があります。head
andコマンドを使用せずにtail
出力を生成できます。 (これを使用すると、tail -n 2
最後の2行が生成されますが、代わりにこれを実行するための代替方法があります。たとえば、ディレクトリには20個の同じサイズのファイルが含まれています(例:file1--10b、file2--10bなど)。 )..file20--10b)tail -n 20
コマンドを使用する代わりに、同じサイズの20個のファイルを自動的にインポートするコマンドはありますか?
私のコード:
#!/bin/bash
dir=$1
if [ $# -ne 1 ]
then
echo "please pass arguments"
exit
fi
if [ -d $dir ]
then
if [ -z "$(ls -1A -- $dir)" ]
then
echo " directory exists but its empty"
else
printf "minimum file size: %s\n"
du $dir -hab | sort -n -r |tail -n 2
find "$dir" -type f -printf '%s %p\n' | sort -n -r | head -n 1 | {
read -r size name
printf "maximum file size: %d\n\t%s\n" "$size" "$name"
}
printf "average file size: %s"
du $dir -sk | awk '{s+=$1}END{print s/NR}'
fi
else
echo " directory doesn't exists"
fi
私の結果は次のとおりです。$./filestats testdir
minimum file size:
15 testdir/subdir3/subdir4/file3.txt
15 testdir/subdir1/file5.txt
maximum file size: 48
testdir/file7.txt
average file size: 60
実際の出力は次のようになります。
$
./filestats testdir
minimum file size: 15
testdir/subdir3/subdir4/file3.txt
testdir/subdir1/file5.txt
maximum file size: 48
testdir/file7.txt
testdir/file8.txt
average file size: 60
答え1
GNUシステムでは:
#! /bin/sh -
find "$1" -type f -printf '%s\0 %p\n\0' |
awk -vRS='\0' '
{getline file}
{n++; sum += $0; files[$0] = files[$0] file}
$0 < min || n == 1 {min = $0}
$0 > max || n == 1 {max = $0}
END {
if (n)
printf "min: %d\n%s\nmax: %d\n%s\naverage: %.17g\n", \
min, files[min], max, files[max], sum/n
}'
これはファイルサイズです(ここ定期的な-type f
ディスク使用量ではなく)を使用するファイルのみが適用されます。ディスク使用の場合は、s引数を使用または置き換え%k
ます%b
。%s
find
-printf
この仮定は、オプションや述部(たとえば、、、、...)$1
のようには見えません。find
-L
!
(
-name
$ that-script /usr/bin
min: 30
/usr/bin/rgrep
/usr/bin/xlinks2
max: 11634832
/usr/bin/doxygen
average: 170653.62570735652
答え2
私はしばしばシェルスクリプトが少し薄暗いと思うので、これを行うためにPythonスクリプトを書いています。
import os
import sys
dir = "."
if len(sys.argv) > 1:
dir=sys.argv[1]
files = [os.path.join(f[0], x) for f in os.walk(dir) for x in f[2]]
filesWithSizes = [(f, os.stat(f).st_size) for f in files if os.path.exists(f)]
sizes = [f[1] for f in filesWithSizes]
maxSize = max(sizes)
minSize = min(sizes)
avgSize = 0
if len(sizes) > 0:
avgSize = sum(sizes) / len(sizes)
maxFiles = [f[0] for f in filesWithSizes if f[1] == maxSize]
minFiles = [f[0] for f in filesWithSizes if f[1] == minSize]
print("Minimum file size: {}".format(minSize))
for f in minFiles:
print(" " + f)
print("Maximum file size: {}".format(maxSize))
for f in maxFiles:
print(" " + f)
print("Average file size: {}".format(avgSize))