如何将输出行拆分为多行(仅行而不是文件)?

如何将输出行拆分为多行(仅行而不是文件)?

我的要求是将输出行显示为多行

我的代码是:

#!/bin/bash
dir="$1"

echo -n "file size:"
du="$(du $dir -hab | sort -n -r | tail -1)"
printf "%s\n" "echo "$du""

它的输出显示为:

     file size:echo 0
./.config/enchant/en_US.dic 

我的预期输出是:

file size: 0
./.config/enchant/en_US.dic 

应该像上面一样显示。该路径应另起一行,并带有一个制表符空格。

答案1

下面将使用heredoc分割管道的输出,然后使用shell的内置printf来格式化文本。

read -r a b <<EOF
$(du -hab "$dir" | sort -nr| tail -n 1)
EOF
printf "file size: %s\n%s\n" "$a" "$b"

答案2

第一个问题是您要printf打印细绳 echo接下来是 的值$du。您没有告诉它打印输出命令 echo "$du"。要执行后者,您需要

printf "%s\n" "$(echo $du)"

但这不是必需的,只需告诉printf打印$du

printf "%s\n" "$du"

下一期包含$du这样的一行”:

file-size   path/to/file    

你需要将其分开。例如,通过将制表符转换为换行符:

printf "%s\n" $(printf "%s\n" "$du" | tr '\t' '\n')

但是,如果您的文件名包含换行符,这与您最初的方法一样将会中断。要处理该文件名和任何其他奇怪的文件名,您可以执行以下操作:

#!/usr/bin/env bash
dir="$1"

## Initialize $size to -1
size=-1;
for f in "$dir"/*; do
    ## If this is a file, set $s to its size
    [ -f "$f" ] && s=$(stat -c '%s' "$f");
    ## If this is the first file, if $size is -1, set $size to $s
    [ $size -eq -1 ] && size=$s;
    ## If the current file's size ($s) is smaller than the smallest found
    ## so far, set $name to the file's name ($f) and $size to the file's
    ## size ($s).
    [[ $s -le $size ]] && name="$f" && size="$s"
done;
## At the end, print the data
printf "file size:%s\n%s\n" "$size"  "$name"

相关内容