디렉터리와 하위 디렉터리의 모든 파일을 크기별로 정렬하여 나열하고 전체 경로는 나열하지 않고 파일 이름만 나열하는 스크립트를 찾고 있습니다.
find . -type f -exec ls -lhS {} \+
작동하지만 경로를 제공합니다.
find . -type f -printf '%f\n'
또한 작동하지만 정렬 방법이 확실하지 않거나 여기에 파일 크기도 포함할 수 있는지 잘 모르겠습니다.
답변1
지원하는 경우 ("파일 크기(바이트)")를 사용할 find
수 있습니다 .%s
-printf
sort
Null로 구분된 입력( )을 지원하는 경우 -z
다음을 수행할 수 있습니다.
find . -type f -printf "%s %f\0" | sort -nz | tr '\0' '\n'
답변2
시스템이 zsh
명령을 지원하는 경우 bash
스크립트에서 실행할 수 있습니다
zsh -c 'ls -lhS -- **/*(.D)'
여기에는 설명이 필요할 수 있습니다.
zsh
: 무엇보다도bash
많은 기능을 갖춘 더욱 강력한 쉘입니다.-c
: 실행할 명령으로 다음 매개변수를 사용합니다.zsh
ls -lhS
: 귀하의 질문에 따르면 이것은 실행하려는 명령입니다--
:-
문자로 시작될 수 있는 이상한 파일 이름을 처리합니다.**
:전반적인 상황여러 디렉터리 일치*
: 기준전반적인 상황- 이 디렉토리의 모든 파일과 일치()
:글로벌 예선어떤 파일을 선택해야 하는지, 어떤 순서로 선택해야 하는지 지정하세요..
: 일반 텍스트 파일만 선택합니다(type f
와 동일find
).D
:결과에 도트 파일(숨겨진 파일)을 포함합니다.
질문을 다시 읽은 후에는 앞 부분뿐만 아니라 결과에서 전체 경로를 제거하는 것이 좋겠다고 생각합니다. 이 작업은 다음을 통해 계속 수행할 수 있습니다 zsh
.
print -l **/*(.OLDe:'reply=${REPLY##*/}':)
그러나 이것은 결국 트릭에 관한 것이 아니기 때문에 약간 많을 수 있으므로 +를 사용하여 "표준" 솔루션을 zsh
제안하겠습니다 .find
sed
find . -type f -exec sh -c 'ls -lhS "$@" | sed "s| \..*/| |"' {} \+