각 파일 이름에 동일한 수의 "-" 구분 기호가 있는 파일 세트를 정렬하고 싶습니다(숫자 정렬에는 -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