다양한 폴더에서 검색된 파일을 크기별로 정렬

다양한 폴더에서 검색된 파일을 크기별로 정렬

$HOME 디렉토리에 있는 모든 PDF를 검색했습니다.

$ find -E ~ -regex ".*/[^/].*.pdf"

1000개 이상의 파일을 인쇄하고
크기별로 정렬하여 검색할 예정입니다.

$ stat -f '%z' draft.sh
184

나는 스크립트 초안을 작성했습니다.

#! /usr/local/bin/bash

OLD_IFS=IFS 
IFS=$'\n'

touch sorted_pdf.md

for file in $(find -E ~ -regex ".*/[^/].*.pdf")
do
    file_size=$(stat -c "%s" $file)
    ....

done > sorted_pdf.md

IFS=OLD_IFS

그들이 함께 일하고 결과를 얻는 것이 어려웠습니다. 어떤 팁을 제공해 주실 수 있나요?

코드를 리팩토링했습니다.

#! /bin/zsh
OLD_IFS=IFS 
IFS=$'\n'

touch sorted_pdf.md

for file in $(find -E ~ -regex ".*/[^/].*.pdf")
do
    # file_size=$(stat -c "%s" $file)
    printf '%s\n' $file(DoL)

done > sorted_pdf.md

IFS=OLD_IFS

하지만 오류 보고서를 받았습니다

$ ./sort_files.sh

./sort_files.sh: line 12: syntax error near unexpected token `('
./sort_files.sh: line 12: `    printf '%s\n' $file(DoL)'

답변1

zsh크기별로 정렬하려면 glob 한정자를 사용할 수 있습니다 ( zshmacOS에 기본적으로 설치되어 있고 기존에도 사용됨 sh).

#! /bin/zsh -
printf '%s\n' **/*.pdf(DoL)
  • **/재귀적인 와일드카드입니다
  • (DoL)D도트 파일(숨겨진 파일)을 포함하고 결과 목록을 파일 길이별로 정렬하는 데 사용되는 findglob oL한정자 입니다 L.

이것은 -regex ".*/[^/].*.pdf그다지 의미가 없습니다.

예를 들어, on /home/foo/pdf, .*on /home, then /, [^/]on f그런 다음 .*on oo, .on 그리고 /그 다음 을 일치시킵니다 pdf.

를 사용하거나 -regex사용하지 않고 파일을 일치시킬 -E수 있지만 표준 .-regex '.*\.pdf'*.pdf-name '*.pdf'

당신이 사용할 수있는:

find . -name '*.pdf' -exec stat -f '%z %N' {} + |
  sort -n |
  cut -d ' ' -f 2-

그러나 개행 문자가 있는 파일 경로가 있으면 작동하지 않습니다.

GNU 유틸리티를 사용하면 다음을 수행할 수 있습니다.

find . -name '*.pdf' -printf '%s %p\0' |
  sort -nz |
  cut -zd ' ' -f 2- |
  tr '\0' '\n'

이러한 파일 중 하나라도 심볼릭 링크 인 경우 pdf심볼릭 링크 대상의 크기가 아닌 심볼릭 링크의 크기가 고려됩니다. 이 대상의 크기를 기준으로 정렬하려면 옵션을 DoL로 변경 D-oL하거나 에 추가 -L하세요 stat. GNU의 경우 find:

find -L . \( ! -xtype l -o -prune \) -name '*.pdf' -printf '%s %p\0' |
  sort -nz |
  cut -zd ' ' -f 2- |
  tr '\0' '\n'

대소 문자를 구분하지 않는 일치의 경우 다음으로 바꾸 거나 pdf( [pP][dD][fF]표준 은 아니지만 GNU 및 BSD에서 지원됨 ) 옵션을 활성화 하고 옵션을 변경하거나 활성화 할 수 있습니다 .-name-inamefindzshextendedglobpdf(#i)pdfnocaseglob

답변2

GNU 에 액세스할 수 있는 경우 find:awk

$ find $HOME -iname "*.pdf" -printf '%s\0%p\n' | sort -h -t '\0' | awk -F '\0' '{print $2}'

이 명령은 다음과 같습니다.

  • 대소문자를 구분하지 않는 pdf 확장자를 가진 모든 파일을 찾아 $HOME각 파일의 크기와 경로를 인쇄합니다.
  • -h사람이 읽을 수 있는 숫자 비교를 지원하는 옵션을 사용하여 첫 번째 필드를 기준으로 목록을 정렬합니다.
  • 정렬된 경로를 인쇄합니다.

관련 정보