한 줄의 크기를 기준으로 가장 큰 것부터 가장 작은 것까지 디렉터리를 나열합니다.

한 줄의 크기를 기준으로 가장 큰 것부터 가장 작은 것까지 디렉터리를 나열합니다.

다음 명령을 사용하여 디렉터리 목록과 해당 크기를 가져오고 이를 가장 큰 것에서 가장 작은 것 순으로 정렬할 수 있습니다(이 예에서는 이해하기 쉽도록 디렉터리 이름을 숫자로 바꿨습니다).

$: du -sk [a-z]* 2>/dev/null | sort -nr
413096  one
106572  two
97452   three
76428   four
55052   five
45068   six
33680   seven
23220   eight
17716   nine

저는 이러한 디렉토리를 가장 큰 것부터 가장 작은 것 순으로 입력해야 하는 프로그램을 작성하고 있지만 편의상 모든 것을 한 줄에 입력해야 합니다. 크기를 표시하지 않고 한 줄에 디렉토리를 가장 큰 것부터 가장 작은 것까지 정렬할 수 있는 명령이 있습니까?

출력이 다음과 같기를 원합니다.

one two three four five six seven eight nine

답변1

디렉터리 이름에 공백이 포함되어 있지 않다고 확신하는 경우 모든 디렉터리 이름을 한 줄로 쉽게 가져올 수 있습니다.

du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'

Python에 정보 입력

Python 프로그램에서 해당 출력을 캡처하여 목록에 넣으려는 경우. Python2.7 이상을 사용하십시오.

import subprocess
dir_list = subprocess.check_output("du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2\" \"}'", shell=True).split()

Python2.6에서:

import subprocess
subprocess.Popen("du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2\" \"}'", shell=True, stdout=subprocess.PIPE).communicate()[0].split()

또한 Python의 기능을 활용하여 셸에서 수행되는 작업량을 줄이고 특히 다음 작업이 필요하지 않게 할 수 있습니다 awk.

subprocess.Popen("du -sk [a-z]*/ | sort -nr", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].split()[1::2]

한 단계 더 나아가 du출력을 Python으로 직접 읽고 크기를 정수로 변환한 다음 크기별로 정렬할 수 있습니다. 그러나 sort -nr이 작업은 셸에서 수행하는 것이 더 쉽습니다.

디렉토리 지정

현재 디렉터리에 원하는 크기의 디렉터리가 없는 경우 두 가지 가능성이 있습니다.

du -sk /some/path/[a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'

그리고:

cd /some/path/ && du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'

둘의 차이는 /some/path출력에 포함되는지 여부입니다.

답변2

사용paste

du -sk [a-z]* 2>/dev/null | sort -nr| cut -f2- | paste -s -

답변3

zsh와일드카드 한정자를 사용하여 와일드카드를 정렬하는 기능. 함수를 사용하여 고유한 전역 한정자를 정의할 수도 있습니다. 예를 들어:

zdu() REPLY=$(du -s -- "$REPLY")

print -r -- [[:alpha:]]*(/nO+zdu)

/[a-z]이 함수는 이름이 문자( )로 시작하는 디렉토리를 숫자(n) 역순(O)으로 인쇄하는 데 사용됩니다( C 로케일에서만 의미 있음 ) zdu.

이 작업을 수행할 때 다음 사항에 유의하세요.

du -s a b

a동일한 파일에 대한 하드 링크가 포함 된 경우 디스크 사용량 은 b계산되지만 a계산되지는 않습니다 b.zsh

Python을 사용한다면 거기에서 동일한 작업을 수행합니다. du -s즉, 각 파일을 호출한 다음 목록을 정렬합니다. 파일 이름에는 공백, 탭, 줄 바꿈을 포함한 모든 문자가 포함될 수 있습니다.

답변4

나는 이 명령이 크기와 디렉터리 경로를 분리하는 du데 사용된다고 생각하므로 몇 가지 추가 인수만 전달하면 됩니다 .\tawk

du -sk [a-z]* 2>/dev/null | sort -nr | awk -F'\t' -v ORS=" " '{print $2}'

디렉터리 경로에 탭 문자도 포함되어 있는 경우 먼저 크기 접두사를 제거할 수 있습니다.

du -sk [a-z]* 2>/dev/null | sort -nr | awk -v ORS=" " '{sub(/^[0-9]*\t/,"");print}'

관련 정보