我的要求是将输出行显示为多行
我的代码是:
#!/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"