크기에 따라 모든 디렉토리를 나열하는 방법은 무엇입니까? [상위 디렉토리 제외]

크기에 따라 모든 디렉토리를 나열하는 방법은 무엇입니까? [상위 디렉토리 제외]

임의의 폴더가 여러 개 있는데 그 중 일부는 숨겨져 있습니다(마침표로 시작). 크기별로 정렬하여 모두 나열하고 싶습니다.

내 마음 속에는 다음과 같은 생각이 있습니다.

ls -d -1 -a */ | xargs du -s | sort

하지만 ls ...해당 부분에는 숨겨진 파일이 표시되지 않습니다. 이전에 동일한 주제에 관해 몇 가지 질문을 받은 것으로 알고 있지만 답변에는 숨겨진 파일을 포함하는 방법이 포함되지 않았습니다. 또는 긴 형식을 사용하므로 출력이 나머지 명령과 호환되지 않게 됩니다.

답변1

ls다음의 출력을 구문 분석합니다.항상 문제가 있다. 출력을 자동으로 처리하려면 항상 다른 도구를 사용해야 합니다.

특정한 경우에는 누락되거나 호환되지 않는 인수 때문에가 아니라 ls보낸 glob 때문에 명령이 실패합니다. ls숨겨진 결과를 포함하여 모든 결과가 나열되도록 요청한 다음 즉시 전역 패턴과 일치하는 결과 -a만 나열하도록 요청합니다.*/아니요시작하는 것과 수행될 수 있는 .모든 것을 일치시키는 것은 ls전역과 일치하는 것으로 제한됩니다. 숨겨진 디렉터리를 일치시키기 위한 두 번째 glob 으로 사용할 수도 있고 .*/, glob 전체를 유지하여 ls작업을 수행하도록 할 수도 있습니다. 그러나 ls일치시킬 전역 변수가 있는 경우에는 이 작업을 수행할 필요조차 없습니다.

한 가지 해결책은 ls완전히 건너뛰고 쉘 글로빙을 사용하는 것입니다.*

$ du -s */ .*/ | sort -n

이 예에서는 다소 과잉일 수 있지만 더 복잡한 경우에 매우 강력한 접근 방식은 다음을 사용하는 것입니다 find.

$ find ./ -type d -maxdepth 1 -exec du -s {} + | sort -n

설명하다:

  • find ./ 현재 디렉터리에서 찾기 작업을 시작합니다. 원하는 경우 다른 경로를 사용할 수 있습니다.
  • -type d디렉토리의 내용만 찾기
  • -maxdepth 1하위 디렉터리를 반복적으로 검색하지 않고 현재 디렉터리의 디렉터리만 찾도록 지시합니다.
  • -exec [command] [arguments] {} +이와 비슷하게 작동 xargs하지만 find이름을 인용하고 이스케이프할 때 모든 무거운 작업을 수행합니다. 이 {}비트는 검색 결과로 대체됩니다.
  • du -s알잖아

-n* 숫자 정렬에는 for 연산자를 사용합니다. sort이 경우 알파벳 정렬보다 숫자 정렬이 더 유용합니다.

답변2

zsh에서는 Dglob 한정자를 사용하여 파일 이름 패턴에 도트 파일을 포함합니다.

du -s -- *(D) | sort -k1n

Bash에서 도트 파일과 일치 dotglob하도록 옵션을 설정합니다.*

shopt -s dotglob
du -s -- * | sort -k1n

ksh에서는 다른 도트 파일 만 무시 하고 다른 도트 파일은 무시 FIGNORE하도록 설정합니다 ..?(.)...

FIGNORE='.?(.)'
du -- * | sort -k1n

당신은 또한 볼 수 있습니다한 디렉터리의 모든 파일(숨겨진 파일 포함)을 다른 디렉터리로 이동하는 방법은 무엇입니까?.

관련 정보