如何存储输出并将其再次打印回来并将输出分成新行

如何存储输出并将其再次打印回来并将输出分成新行

我想将输出存储在变量中并希望显示如下。

我的代码:

#!/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)。

相关内容