出力を変数に保存し、次のように表示したいと思います。
私のコード:
#!/bin/bash
dir=$1
printf "file size: %s\n" \
du "$dir" -hab | sort -n -r |tail -n 2
この出力を変数に保存し、目的の出力に再印刷したいと思います。
私が望む出力:
$ ./filestats test
minimum file size: 15
test/subdir/file3.txt
test/file5.txt
答え1
1つの方法は次のとおりです。
#!/bin/bash
dir=$1
minfile=$( du "$dir" -hab | sort -n -r | tail -1 | awk '{ print $1 }' )
out=$( du "$dir" -hab | sort -n -r | tail -n 2 | awk '{ print $2 }' )
printf "Minimum file size: %s\n" "$minfile"
printf "$out\n"
上記のコードの出力例:
Minimum file size: 94
/home/krt/my-scripts/multissh.sh
/home/krt/my-scripts/vpn.sh
答え2
次のことを試すことができます。
size=$(du -hab "$dir" | sort -n -r | tail -n 2)
printf "File size: %s" "$size"
答え3
あなたが望むのは、i)ディレクトリとそのサブディレクトリで最小のファイルサイズを探し、ii)最小サイズのすべてのファイルを一覧表示するスクリプトだと思います。その場合は、次のようにできます。
#!/usr/bin/env bash
du -ab "$@" |
awk -F"\t" '($1<=s || NR==1){
s=$1;
a[s]=a[s]"\n\t"$2;
a[-1]=1
}
END{
if(a[-1]){
printf "Smallest file size:%d%s\n",s,a[s]}
}'
または、単一のコード行で実行します。
du -ab | awk -F"\t" '($1<=s || NR==1){s=$1;a[s]=a[s]"\n\t"$2;a[-1]=1}END{if(a[-1]){printf "Smallest file size:%d%s\n",s,a[s]}}'
出力例:
$ a.sh .
Smallest file size:42
./foo/file2
./file13
./file with spaces
説明する
du -ab
-b
:と両方を使用することは意味がなく、-h
互いに上書きされます。これにより、すべてのファイルとディレクトリのサイズが印刷されます。awk -F"\t"
:awk
入力フィールドの区切り記号をタブに設定するには、実行します。これにより、スペースを含むファイル名が正しく処理されます。($1<=s || NR==1){...}
:ファイルサイズが最小サイズより小さい、または最初に見つかったファイルの場合。a[s]=a[s]"\n"$2;
a
:各ファイルサイズをキーに、ファイルリスト(改行で区切り)を値として使用する連想配列です。ファイルが最小のファイルより小さいか小さい場合は、配列に追加されます。s=$1;
:s
新しい最小サイズに設定されます。a[-1]=1
:ファイルが見つからない場合は、スクリプトが出力を印刷しないようにするために使用されます。1
1つ以上のファイルが見つかった場合は、そのファイルを 。
END{}
:入力をすべて読んだ後に実行します。この時点で、s
最小のファイルサイズが見つかります。if(a[-1]){...}
:少なくとも1つのファイルまたはディレクトリが見つかった場合。printf "Minimum file size:%d%s\n",s,a[s]
:印刷してください。
ノート
- これはスペースを含むファイル名を処理します(タブまたは改行文字が含まれている場合は中断されます)。
- 複数の宛先ディレクトリを処理できます。
- ファイル/ディレクトリが見つからない場合、出力は返されません。
- リストみんな最後のN個のファイル(使用されている場合
tail
)だけでなく、最小サイズのファイル。