사람이 읽을 수있는 크기를 정렬하는 방법 사람이 읽을 수 있기를

기본적으로 파일을 찾은 다음 크기별로 정렬합니다. 사람이 읽을 수있는 크기로 정렬하지 않으면 스크립트가 작동합니다. 그러나 크기를 사람이 읽을 수 있기를 원합니다. 사람이 읽을 수있는 크기를 어떻게 정렬 할 수 있습니까?

예를 들면 다음과 같습니다.

 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 ...려면 (또는 )를 사용하십시오 . … 또는 Dglob 한정자 문자열에 추가하십시오 .


경로 이름과 사람이 읽을 수있는 크기의 2 열 출력을 원한다고 가정하고 numfmtGNU 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

첫 번째 awkexp는 1M보다 작은 파일을 찾고 두 번째 exp는 결과에서 바이트 크기를 가져 와서이를 KB로 변환하고 처음 3 개의 요소를 인쇄하여 사람이 읽을 수있는 크기를 제공합니다.


답변