![이름의 일부로 파일을 정렬하는 방법은 무엇입니까?](https://linux55.com/image/79082/%EC%9D%B4%EB%A6%84%EC%9D%98%20%EC%9D%BC%EB%B6%80%EB%A1%9C%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%A0%95%EB%A0%AC%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
다음 문서가 주어지면 :
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
-z
tr
\0
\n
printf '%s\0' *SC* | sort -zt. -k2 | tr '\0' '\n'
답변2
oe
zsh를 사용하면 또는 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 1
null 바이트( )로 구분하여-print0
인쇄합니다 .sort
null 바이트( )로 구분된 입력을 읽고-z
점( )으로 구분된 세 번째 필드( )부터 시작하는 레코드 부분을 정렬합니다.-k3
-t.
while
입력 읽기basename
경로 없이 이름을 인쇄합니다 .
답변4
나는 종종 그러하듯이 제안할 것이다 perl
.
perl
비교 함수를 지정할 수 있는 정렬 함수가 있습니다. 이 비교 함수는 두 값을 취하고 -1
상대 위치에 따라 OR를 반환하는 테스트입니다 .0
1
목록을 반복하고 각 값을 $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*")'