내 요구 사항은 출력 줄을 여러 줄로 표시하는 것입니다
내 코드는 다음과 같습니다
#!/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를 사용하여 파이프의 출력을 분할한 다음 쉘의 내장 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
print에게만 알려주십시오 $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"