我想将输出存储在变量中并希望显示如下。
我的代码:
#!/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
这是一种方法:
#!/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
如果至少找到一个文件,我们将其设置为。
END{}
:读取所有输入后执行。此时,s
将会找到最小的文件大小。if(a[-1]){...}
:如果至少找到一个文件或目录;printf "Minimum file size:%d%s\n",s,a[s]
:打印它/它们。
笔记
- 这可以处理包含空格的文件名(如果它们包含制表符或换行符,则会中断);
- 可以处理多个目标目录;
- 如果未找到文件/目录,则不返回任何输出;
- 列表全部最小大小的文件,而不仅仅是最后 N 个文件(如果使用 则得到
tail
)。