출력을 저장하고 다시 인쇄하고 출력을 새 줄로 분할하는 방법

출력을 저장하고 다시 인쇄하고 출력을 새 줄로 분할하는 방법

출력을 변수에 저장하고 아래와 같이 표시하고 싶습니다.

내 코드:

#!/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)뿐만 아니라 최소 크기 파일.

관련 정보