
명령을 실행하면 du -ah | sort -nr
출력의 어떤 줄이 파일이고 어떤 폴더인지 표시하도록 할 수 있습니까? 명령과 같은 것은 앞에 ls -l
파일과 폴더가 무엇인지 보여줍니다 .d
-
답변1
그것은 일종의 가능하지만 다른 명령의 도움 없이는 불가능합니다. 구체적으로 여기서는 GNU awk를 사용하고 있습니다(중요하므로 awk 버전을 확인하세요).
$ du -ah | sort -nr | awk '{usage=$1; $1="";cmd="file "$0;cmd |& getline type;print usage,type ;close(cmd)}'
24K .: directory
4.0K ./testdir: directory
4.0K ./out.txt: ASCII text
4.0K ./3.txt: ASCII text
4.0K ./2.txt: ASCII text
4.0K ./1.txt: ASCII text
물론 이 접근 방식은 공백이 포함된 파일 이름에서는 실패하는 것처럼 보이기 때문에 약간의 결함이 있습니다(아직 개선 작업 중).
대안으로 find
명령을 사용하여 모든 파일을 찾고 명령을 실행하여 file
플래그 를 du
통해 입찰을 수행할 수도 -exec
있지만 약간 보기 흉해 보입니다(편집 기록 참조). 그러나 훨씬 더 멋진 출력을 위한 형식 으로 파일 형식을 인쇄하려면 의 플래그를 find
사용할 수 있습니다 .-printf
%y
$ find -mindepth 1 -printf "%y\t" -exec du "{}" \; | sort -rn
f 4 ./out.txt
f 4 ./3.txt
f 4 ./2.txt
f 4 ./1.txt
f 0 ./with space.txt
d 4 ./testdir
분명히 여기는 f
일반 파일용이고 d
디렉토리용입니다. find
플래그 및 파일 형식 문자에 대한 자세한 내용은 의 매뉴얼을 참조하세요 .
답변2
Serg가 말했듯 du
이 이 작업은 스스로 수행할 수 없습니다. 파일 이름을 안전하게 처리하려면 가장 좋은 방법은 ASCII 널 문자( \0
) 로 구분하는 du
것 입니다.저것. 따라서 이를 null로 구분된 입력을 처리하는 기능과 함께 ' sort
사용 합니다.xargs
du -0ah |
sort -zh |
xargs -0 sh -c 'for i; do s=${i%%[[:space:]]*};f=${i#*[[:space:]]}; echo "$s" "$(ls --color -dF "$f")"; done' _
-0
, -z
및 -0
옵션은 , du
및 sort
구분 xargs
기호로 ASCII nul을 사용하도록 지시합니다.
그런 다음 s=${i%[[:space:]]*}
공백(크기)까지 줄의 시작을 가져오고 f=${i#*[[:space:]]}
다른 모든 것(파일 이름)을 가져옵니다. 그런 다음 ls
장식을 사용하여 파일 이름을 인쇄합니다.
예:
$ du -0ah Screenshots | sort -zh | xargs -0 sh -c 'for i; do s=${i%%[[:space:]]*};f=${i#*[[:space:]]}; echo "$s" "$(ls --color -dF "$f")"; done' _
512 Screenshots/desktop.ini*
264K Screenshots/Screenshot (1).png*
269K Screenshots/
을 사용했기 때문에 ls --color
멋진 색상 출력도 얻을 수 있습니다.