예

각 파일 이름에 동일한 수의 "-" 구분 기호가 있는 파일 세트를 정렬하고 싶습니다(숫자 정렬에는 -n 사용).

샘플 목록은 다음과 같습니다.

/home/flora/edvart/docs/schimmel-01.png
/home/flora/edvart/docs/schimmel-02.png
/home/flora/edvart/docs/schimmel-03.png
/home/flora/edvart/docs/schimmel-04.png
/home/flora/edvart/docs/schimmel-05.png
/home/flora/edvart/docs/schimmel-06.png
/home/flora/edvart/docs/schimmel-07.png
/home/flora/edvart/docs/schimmel-08.png
/home/flora/edvart/docs/schimmel-09.png
/home/flora/edvart/docs/schimmel-10.png
/home/flora/edvart/docs/schimmel-11.png
/home/flora/edvart/docs/schimmel-12.png
/home/flora/edvart/docs/schimmel-13.png

이것은 내가 사용하는 코드입니다.

for fl in "$@"; do
   fnme=${fl##*/}
   ftyp=${fl##*.}

   fdir=${fl%/*}
   fnam=${fnme%.*}

   nf=$( echo "$fnam" | awk -F '-' '{print NF}')
   ifld=$(( nf + 1 ))

   find "$fdir" -type f -name "${fnam}-*.png" |
     awk -F'[-.]' '{print $(NF-1), $0}' RS='\0' ORS='\0' |
     sort -znt '-' -k "$ifld"n | 
   while IFS= read -r flimg
   do
     echo "$flimg"
   done
done

하지만 처음 세 개의 파일 -1,-2,-3을 사용해 보면 결과가 여전히 숫자순으로 정렬되지 않습니다.

/home/flora/edvart/docs/schimmel-04.png
/home/flora/edvart/docs/schimmel-05.png
/home/flora/edvart/docs/schimmel-06.png
/home/flora/edvart/docs/schimmel-07.png
/home/flora/edvart/docs/schimmel-08.png
/home/flora/edvart/docs/schimmel-09.png
/home/flora/edvart/docs/schimmel-10.png
/home/flora/edvart/docs/schimmel-11.png
/home/flora/edvart/docs/schimmel-12.png
/home/flora/edvart/docs/schimmel-13.png
/home/flora/edvart/docs/schimmel-1.png
/home/flora/edvart/docs/schimmel-2.png
/home/flora/edvart/docs/schimmel-3.png

답변1

zsh에는 shell option 이라는 쉘 옵션이 있습니다 NUMERIC_GLOB_SORT. 기본적으로 와일드카드 패턴을 숫자로 정렬합니다.

쉘이 아닌 경우 zsh:

zsh -o NUMERIC_GLOB_SORT -c 'printf "%s\n" /home/flora/edvart/docs/*.png'

또는 (n)glob 한정자를 사용하여 특정 모드에 대해서만 이 셸 옵션을 활성화합니다.

zsh -c 'printf "%s\n" /home/flora/edvart/docs/*.png(n)'

zsh -c또는 스크립트에서 패턴을 하드코딩하는 대신 패턴을 매개변수로 전달하세요 . 패턴에는 따옴표가 필요합니다.

zsh -c 'printf "%s\n" ${~1}(n)' zsh '/home/flora/edvart/docs/*.png'

시험:

$ ls -d *.png
schimmel-04.png   schimmel-08.png   schimmel-11.png   schimmel-3.png
schimmel-05.png   schimmel-09.png   schimmel-12.png
schimmel-06.png   schimmel-1.png    schimmel-13.png
schimmel-07.png   schimmel-10.png   schimmel-2.png
$ zsh -c 'printf "%s\n" ${~1}(n)' zsh '*.png'
schimmel-1.png
schimmel-2.png
schimmel-3.png
schimmel-04.png
schimmel-05.png
schimmel-06.png
schimmel-07.png
schimmel-08.png
schimmel-09.png
schimmel-10.png
schimmel-11.png
schimmel-12.png
schimmel-13.png

디렉터리 경로에 더 많은 숫자가 있는 경우 디렉터리 경로의 숫자가 동일한 한 계속 작동합니다.

답변2

sed어쩌면 마지막 필드를 캡처하기 위해 파일 목록을 조작하는 것이 더 쉬울 수도 있습니다.그리고 처음에 추가:

sed -e 's/^.*-\([^-]*\)\.[^.]*/\1-&/g'

이제 다음을 사용할 수 있습니다.첫 번째cut가짜 "파일 이름" 필드는 정렬 후 첫 번째 필드를 건너뛰어 추가 데이터를 제거할 수 있습니다.

cut -f2- -d-

그래서:

ls | sed | sort | cut

나는 이 작은 디렉토리를 생성하고 그 안에 길이가 0인 파일 몇 개를 건드렸습니다.

Oct 17 01:06 .
Oct 17 01:06 ..
Oct 17 01:06 201-ventosa-title-001.png
Oct 17 01:06 201-ventosa-title-002.png
Oct 17 01:06 201-ventosa-title-12.png
Oct 17 01:06 201-ventosa-title-17.png
Oct 17 01:06 201-ventosa-title-356.png
Oct 17 01:06 201-ventosa-title-91.png
Oct 17 01:06 333-ventosa-longer-title-this-time-77.jpg

ls | sed -e 's/^.*-\([^-]*\)\.[^.]*/\1-&/g' | sort -rn | cut -f2- -d-

예상대로,

201-ventosa-title-356.png
201-ventosa-title-91.png
333-ventosa-longer-title-this-time-77.jpg
201-ventosa-title-17.png
201-ventosa-title-12.png
201-ventosa-title-002.png
201-ventosa-title-001.png

(정렬에서 "r" 옵션을 제거하면 순서가 반대로 됩니다).

숫자가 다른 필드에 있더라도 "77" 요소는 올바르게 배치됩니다.

답변3

mawk 1.3.3-17을 사용하고 있기 때문에 문제가 발생합니다. 버전 1.3.4 이상에서는 "널 문자"를 의미하는 레코드 구분 기호로 \0을 사용할 수 있습니다. 이전 버전의 mawk, BSD awk, Busybox awk, Plan 9 awk 등은 모두 문자열을 \0빈 문자열로 처리합니다. 즉, "단락 모드"(이중 개행 구분 레코드)를 활성화합니다 RS.RS

관련 정보