다음 명령을 사용하여 디렉터리 목록과 해당 크기를 가져오고 이를 가장 큰 것에서 가장 작은 것 순으로 정렬할 수 있습니다(이 예에서는 이해하기 쉽도록 디렉터리 이름을 숫자로 바꿨습니다).
$: 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
데 사용된다고 생각하므로 몇 가지 추가 인수만 전달하면 됩니다 .\t
awk
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}'