파일 이름을 가져온 다음 크기별로 목록을 정렬하고 목록에서 명령을 실행하는 작은 스크립트를 만들려고 합니다. 지금까지 나는 다음을 가지고 있습니다 :
#!/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]'])