출력 줄을 여러 줄(파일이 아닌 줄만)로 분할하는 방법은 무엇입니까? [복사]

출력 줄을 여러 줄(파일이 아닌 줄만)로 분할하는 방법은 무엇입니까? [복사]

내 요구 사항은 출력 줄을 여러 줄로 표시하는 것입니다

내 코드는 다음과 같습니다

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

그러나 이것은 필수는 아닙니다 . printfprint에게만 알려주십시오 $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"

관련 정보