연습으로서 하위 디렉터리의 패드를 포함하여 지정된 확장자(예: .txt)가 있는 모든 패드를 크기별로 정렬하는 스크립트를 완성해야 합니다.
For example;
./ex1.sh einstein txt
einstein/copyright.txt
einstein/do-how.txt
einstein/etext9/bil11.txt
einstein/etext9/2ws271.txt
einstein/etext9/liber11.txt
einstein/etext0/bib0010h/Readme.txt
einstein/etext0/kknta10.txt
du 또는 기타 고급 명령을 사용할 수 없습니다. 어느 시점에서는 find를 사용해야 하는데, 다음과 같은 것을 시도했습니다.
find -depth - type f -name "*.$extension" | sort ....
하지만 크기별로 정렬하는 방법을 모르기 때문에 이것은 잘 작동하지 않습니다. 내가 얻은 결과는 이름별로 정렬됩니다.
ls -lhS와 유사하지만 하위 디렉터리를 포함하는 출력을 찾고 있습니다.
답변1
AFAIK에서 수행할 수 있는 유일한 주문은 find
포함 디렉터리(옵션) 앞에 콘텐츠를 표시하는 것입니다 -depth
. 크기별로 정렬하려면 다른 것을 사용해야 합니다.
GNU 조회가 있는 경우 다음을 시도해 보세요.
find . -type f -iname "*.$extension" -printf "%s %p\n" | sort -n | sed 's/^[0-9]* //'
-printf "%s %p\n"
크기와 파일 경로를 인쇄한 다음 숫자로 정렬한 다음 스트립 크기를 사용합니다 sed
.
답변2
나는 사용한다
find . -type f -iname "*.$extension" -print0 | xargs -0 ls -lS
이건 나한테는 괜찮아
답변3
그리고 zsh
:
printf '%s\n' **/*.$extension(D.oL)
ls -lh
GNU 유형 출력을 얻으려면 GNU를 사용하십시오 ls
.
ls -Ulhd -- **/*.$extension(D.oL)
또는 목록이 너무 큰 경우:
autoload zargs # best in ~/.zshrc
zargs --eof= -- **/*.$extension(D.oL) '' ls -Ulhd --
또는
printf '%s\0' **/*.$extension(D.oL) | xargs -r0 ls -Ulhd --
어떤 이유로든 꼭 사용해야 하는 경우 find
언제든지 다음을 수행할 수 있습니다.
printf '%s\0' ./**/*.$extension(D.oL) | xargs -r0 sh -c '
exec find "$@" -prune ...' sh
답변4
와는 별개로무루의 대답
-exec du '{}' ';'
대신 사용하여 -printf "%s %p"
동일한 형식을 생성할 수 있습니다. 그래서 마지막 명령은 다음과 같습니다
find . -type f -iname "*.$extension" -exec du '--' '{}' ';' | sort -n | sed 's/^[0-9]* //'
설명-exec du '-b' '--' '{}' ';'
-exec
플래그는find
명령(예:du
)을 실행하고{}
인수에 나타나는 모든 항목을 파일 경로로 바꾸도록 지시합니다.'-b'
du
킬로바이트 대신 바이트를 출력하도록 명령에 지시합니다.'--'
옵션의 끝을 나타내는 (플래그? 이름에 대한 도움이 필요합니다)이고 나머지 인수는 위치 인수입니다. 이것이 필요한 예는 모호하게 이름이 지정된 옵션 파일을 사용하여 작업을 수행하는 것입니다.-whatever
'{}'
지점 1로 돌아가서find
이를 파일 경로로 바꿉니다.";"
인수가 끝났으며 나머지 인수는 정상적으로 처리될 수 있음을find
명령 에 알립니다 .-exec