이름의 일부로 파일을 정렬하는 방법은 무엇입니까?

이름의 일부로 파일을 정렬하는 방법은 무엇입니까?

다음 문서가 주어지면 :

ABC38388.SC01.StatueGrade_MKP
ABC38388.SC02.Statue_GKP
DEF38389.SC03.Statue_HKP
XYZ38390.SC00.Statue_WKP

다음과 같은 값을 기준으로 어떻게 나열할 수 있습니까 SC?

XYZ38390.SC00.Statue_WKP
ABC38388.SC01.StatueGrade_MKP
ABC38388.SC02.Statue_GKP
DEF38389.SC03.Statue_HKP

답변1

파일 이름에 공백이나 기타 이상한 문자가 포함되지 않은 이 특별한 경우에는 ls다음을 사용하여 파이프 할 수 있습니다 sort.

$ ls -d -- *.SC* | sort -t. -k2
XYZ38390.SC00.Statue_WKP
ABC38388.SC01.StatueGrade_MKP
ABC38388.SC02.Statue_GKP
DEF38389.SC03.Statue_HKP

-t필드 구분 기호를 설정 하고 두 번째-k2 필드 로 시작하는 줄 부분을 기준으로 정렬하도록 지시합니다 (두 번째 필드의 경우).sort-k2,2오직).

더 복잡한 경우에는 각 파일 이름 뒤에 NULL 문자( )를 인쇄한 다음 \0해당 옵션을 사용하여 GNU에 파이프하여 NULL로 구분된 줄을 읽도록 지시하고 마지막으로 다음을 사용하여 다시 변경할 수 있습니다.sort-ztr\0\n

printf '%s\0' *SC* | sort -zt. -k2 | tr '\0' '\n'

답변2

oezsh를 사용하면 또는 glob 한정자를 사용하여 자체 glob 정렬 순서를 정의할 수 있습니다 o+.

ls -lUd -- *(oe['REPLY=${REPLY#*.SC}'])

또는:

bysc() REPLY=${REPLY#*.SC}
ls -lUd -- *(o+bysc)

정렬 함수는 파일 이름을 받고 와일드카드 문자를 기준으로 정렬할 $REPLY문자열을 반환합니다 . $REPLY여기서는 파일 이름의 오른쪽 부분 .SC(또는 포함되지 않은 경우 전체 파일 이름 .SC)이 처음 나타나는 것을 반환합니다.

답변3

GNU 시스템에서 zsh또는 bash셸을 사용하여 다음 명령을 사용합니다.

find -maxdepth 1 -type f -print0 | sort -z -t. -k3 | \
while IFS="" read -r -d "" f; do
  basename "$f"
done

  • find현재 디렉터리( )에서 파일을 검색하여 -maxdepth 1null 바이트( )로 구분하여 -print0인쇄합니다 .
  • sortnull 바이트( )로 구분된 입력을 읽고 -z점( )으로 구분된 세 번째 필드( )부터 시작하는 레코드 부분을 정렬합니다.-k3-t.
  • while입력 읽기
    • basename경로 없이 이름을 인쇄합니다 .

답변4

나는 종종 그러하듯이 제안할 것이다 perl.

perl비교 함수를 지정할 수 있는 정렬 함수가 있습니다. 이 비교 함수는 두 값을 취하고 -1상대 위치에 따라 OR를 반환하는 테스트입니다 .01

목록을 반복하고 각 값을 $a합계 로 설정하고 $b각 요소에 대해 "테스트"합니다.

따라서 기본적으로 다음과 같습니다.

$a cmp $b 

문자열 비교 또는 sort { $a <=> $b }숫자 비교에 사용됩니다.

그러나 결과적으로 임의로 복잡한 사용자 정의 정렬 기준을 적용할 수 있습니다.

#!/usr/bin/perl
use strict;
use warnings;

sub sort_by_sc {
   my ( $a_sc ) = $a =~ m/SC(\d+)/;
   my ( $b_sc ) = $b =~ m/SC(\d+)/;
   return $a_sc <=> $b_sc;
}


my @file_list = qw ( 
    ABC38388.SC01.StatueGrade_MKP
    ABC38388.SC02.Statue_GKP
    DEF38389.SC03.Statue_HKP
    XYZ38390.SC00.Statue_WKP
);

print sort sort_by_sc @file_list;

또는 한 줄, 읽기 STDIN또는 파일로 단순화합니다(일반적으로 개행으로 구분됨).

perl -e 'print sort {@x = map {/SC(\d+)/}($a,$b); $x[0] <=> $x[1]} <>'

glob대신 디렉터리 모드의 결과를 제공할 수 있습니다.

perl -e 'print sort {@x = map {/SC(\d+)/}($a,$b); $x[0] <=> $x[1]} glob ( "*SC*")'

관련 정보