출력을 변수에 저장하고 아래와 같이 표시하고 싶습니다.
내 코드:
#!/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
)뿐만 아니라 최소 크기 파일.