파일 이름 변수 목록을 크기별로 정렬

파일 이름 변수 목록을 크기별로 정렬

파일 이름을 가져온 다음 크기별로 목록을 정렬하고 목록에서 명령을 실행하는 작은 스크립트를 만들려고 합니다. 지금까지 나는 다음을 가지고 있습니다 :

#!/bin/bash
filenames="one \
           two \
           three"
for i in $filenames; do
...
done

작동하지만 for 명령을 누르기 전에 파일 크기별로 목록을 정렬하고 싶습니다.

답변1

파일 이름에 개행 문자가 포함되어 있지 않고 시스템에 GNU 가 있는 경우 다음을 stat수행할 수 있습니다.

  • 배열 변수 사용filenames
  • stat각 파일의 크기와 파일 이름을 인쇄 한 다음 sort결과(역수)를 사용한 다음 첫 번째 필드(크기)를 제거하여 cut파일 이름을 크기별로 정렬(가장 큰 것부터)하는 데 사용됩니다.
  • 추가 처리를 위해 결과를 while루프에 공급합니다.

filenames=( one two three )
while IFS= read -r file; do
  echo "do something with $file"
done < <(stat --printf '%s\t%n\n' -- "${filenames[@]}" | sort -nr | cut -f2-)

위와 동일하지만 널 문자를 구분 기호로 사용합니다(파일 이름에 개행 문자가 포함되지 않는다고 보장할 수 없는 경우 GNU sort및 GNU 도 필요합니다 cut).

filenames=( one two three )
while IFS= read -r -d $'\0' file; do
  printf 'do something with %s\n' "$file"
done < <(stat --printf '%s\t%n\0' -- "${filenames[@]}" | sort -znr | cut -zf2-)

유형의 파일 이름에 대해 참고하십시오.심볼릭 링크, 링크 자체의 크기(링크가 가리키는 파일의 크기가 아님)가 고려됩니다. 변경 -L하려면 옵션을 추가하세요 .stat

표준 입력에서 열린 파일로 해석되는 이라는 이름의 파일에서는 작동하지 않습니다 -. stat사용 ./-하여 해결하세요.

답변2

zsh같은 방법다음은 mtime별 정렬에 관한 유사한 질문에 대한 답변입니다., 그 자체는 다음에서 적응되었습니다.저것, 임의의 순서에 따라 배열을 정렬합니다(자세한 내용은 후자 참조).

zmodload zsh/stat

array=(one two three...)

# store sizes in an "A"ssociative array:
typeset -A size
stat -nL -A size +size -- $array

# sort using the oe glob qualifier "n"umerically
sorted_array=(/(e['reply=($array)']noe['REPLY=$size[$REPLY]'])

관련 정보