$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 한정자를 사용할 수 있습니다 ( zsh
macOS에 기본적으로 설치되어 있고 기존에도 사용됨 sh
).
#! /bin/zsh -
printf '%s\n' **/*.pdf(DoL)
**/
재귀적인 와일드카드입니다(DoL)
D
도트 파일(숨겨진 파일)을 포함하고 결과 목록을 파일 길이별로 정렬하는 데 사용되는find
globoL
한정자 입니다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
-iname
find
zsh
extendedglob
pdf
(#i)pdf
nocaseglob
답변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
사람이 읽을 수 있는 숫자 비교를 지원하는 옵션을 사용하여 첫 번째 필드를 기준으로 목록을 정렬합니다.- 정렬된 경로를 인쇄합니다.