기본적으로 파일을 찾은 다음 크기별로 정렬합니다. 사람이 읽을 수있는 크기로 정렬하지 않으면 스크립트가 작동합니다. 그러나 크기를 사람이 읽을 수 있기를 원합니다. 사람이 읽을 수있는 크기를 어떻게 정렬 할 수 있습니까?
예를 들면 다음과 같습니다.
ls -l | sort -k 5 -n | awk '{print $9 " " $5}'
예상대로 작동합니다. 파일 크기가 오름차순으로 표시됩니다.
1.txt 1
test.txt 3
bash.sh* 573
DocGeneration.txt 1131
andres_stuff.txt 1465
Branches.xlsx 15087
foo 23735
bar 60566
2016_stuff.pdf 996850
이제 크기를 사람이 읽을 수 있기를 원하므로 ls에 -h 매개 변수를 추가했으며 이제 일부 파일이 잘못되었습니다.
ls -lh | sort -k 5 -n | awk '{print $9 " " $5}'
1.txt 1
DocGeneration.txt 1.2K
andres_stuff.txt 1.5K
test.txt 3
Branches.xlsx 15K
foo 24K
bar 60K
bash.sh* 573
2016_stuff.pdf 974K
답변
시험 sort -h k2
-h,-인간-숫자-소트-인간 판독 가능 숫자 비교 (예 : 2K 1G)
gnu sort, BSD sort 등의 일부입니다.
답변
ls
이 기능이 내장되어 있으면 -S
옵션을 사용하고 역순으로 정렬하십시오.ls -lShr
-r, --reverse
reverse order while sorting
-S sort by file size, largest first
답변
특정 쉘이 언급되지 않았으므로 zsh
다음 은 쉘 에서 모든 작업을 수행하는 방법입니다 .
ls -lhf **/*(.Lk-1024oL)
**
처럼 글로브 패턴은 일치 *
하지만에 걸쳐 /
같은 즉, 경로 이름에서 재귀 검색 할 것입니다.
이 ls
명령을 사용하면 사람이 읽을 수있는 크기를 사용할 수 -h
있고 긴 목록 출력 형식을 사용할 수 -l
있습니다. 이 -f
옵션은 정렬을 비활성화하므로 ls
파일을 주어진 순서대로 나열합니다.
이 순서는 **/*(.Lk-1024oL)
파일 이름 글 로빙 패턴으로 정렬 되므로 작은 파일이 먼저 나열됩니다. **/*
비트는이 디렉토리 아래에있는 모든 파일 및 디렉토리와 일치하지만 (...)
수정합니다 글로브의 행동 (그것이 “글로브 규정 자”이다).
그것은을의 oL
끝에서 그 주문 ( o
파일 크기에 의해) 이름 ( L
“길이”).
.
시작시는 글로브는 일반 파일 (아무 디렉토리)와 일치한다.
Lk-1024
크기가 1024 미만 KB ( “KB 길이 이하가 1024”)는 비트 선택 파일.
zsh
기본 대화식 쉘이 아닌 경우 다음을 사용할 수 있습니다.
zsh -c 'ls -lf **/*(.Lk-1024oL)'
숨겨진 이름과도 일치 setopt GLOB_DOTS
시키 zsh -o GLOB_DOTS -c ...
려면 (또는 )를 사용하십시오 . … 또는 D
glob 한정자 문자열에 추가하십시오 .
경로 이름과 사람이 읽을 수있는 크기의 2 열 출력을 원한다고 가정하고 numfmt
GNU coreutils를 사용 한다고 가정하면
zmodload -F zsh/stat b:zstat
for pathname in **/*(.Lk-1024oL); do
printf '%s\t%s\n' "$pathname" "$(zstat +size "$pathname" | numfmt --to=iec)"
done
또는 더 빨리
paste <( printf '%s\n' **/*(.Lk-1024oL) ) \
<( zstat -N +size **/*(.Lk-1024oL) | numfmt --to=iec )
답변
귀하의 경우 sort
이없는 -h
옵션을 사용하면 다음과 같은 awk 명령 (매우 긴 불구하고)을 사용할 수 :
find . -type f -size -1024k -exec ls -al {} \; | sort -k 5 -n | awk '{if ($5 > 1099511627776) {print $9,$5/1024/1024/1024/1024"T"} else if ($5 > 1073741824) {print $9,$5/1024/1024/1024"G"} else if ($5 > 1048576) {print $9,$5/1024/1024"M"} else if ($5 > 1024) {print $9,$5/1024"K"} else {print $9,$5"B"}}' | column -t
그러면 출력이 바이트 단위로 정렬 된 다음 나중에 사람이 읽을 수있는 크기로 변환됩니다.
답변
이게 효과가 있을까요?
ls -l | awk '{if ($5<=1024) {print}}' | sort -k 5 -n | awk '{print $9"\t"substr($5/1024,1,3)"k"} '| column -t
첫 번째 awk
exp는 1M보다 작은 파일을 찾고 두 번째 exp는 결과에서 바이트 크기를 가져 와서이를 KB로 변환하고 처음 3 개의 요소를 인쇄하여 사람이 읽을 수있는 크기를 제공합니다.