파일 이름별로 파일 경로 목록을 정렬하는 방법은 무엇입니까?

파일 이름별로 파일 경로 목록을 정렬하는 방법은 무엇입니까?

files.txt라는 텍스트 파일에 다음 파일 목록이 있습니다.

./themes/seven/images/list-item-rtl.png
./themes/seven/images/arrow-desc.png
./themes/seven/images/arrow-prev.png
./themes/seven/images/fc-rtl.png
./themes/seven/ie7.css
./xmlrpc.php
./MAINTAINERS.txt
./update.php
./README.txt
./COPYRIGHT.txt
./web.config

파일 이름으로만 정렬하고 싶습니다(마지막 슬래시 이후의 첫 번째 문자 기준). 따라서 위의 출력은 다음과 같습니다.

./COPYRIGHT.txt
./MAINTAINERS.txt
./README.txt
./themes/seven/images/arrow-desc.png
./themes/seven/images/arrow-prev.png
./themes/seven/images/fc-rtl.png
./themes/seven/ie7.css
./themes/seven/images/list-item-rtl.png
./update.php
./web.config
./xmlrpc.php

어떻게 해야 하나요?

답변1

$ awk -F '/' '{ printf "%s/%s\n", $NF, $0 }' files.txt | sort | cut -d '/' -f 2-
./COPYRIGHT.txt
./MAINTAINERS.txt
./README.txt
./themes/seven/images/arrow-desc.png
./themes/seven/images/arrow-prev.png
./themes/seven/images/fc-rtl.png
./themes/seven/ie7.css
./themes/seven/images/list-item-rtl.png
./update.php
./web.config
./xmlrpc.php

이렇게 하면 줄 앞에 파일 이름 복사본이 추가되고 그 뒤에 /문자 하나가 추가됩니다. 파일 이름은 /마지막으로 구분된 필드를 통해 가져옵니다. 마지막 필드 $NF는 에 있습니다 awk.

명령의 출력이 awk정렬됩니다. 이 정렬 /에서는 행 앞에 추가된 -delimited 필드를 사용합니다 . cut그런 다음 추가된 구분 필드를 제거하는 데 사용됩니다 /.

이 접근 방식은 경로 이름에 리터럴 개행 문자가 포함되지 않는 한 작동합니다.

/경로 이름이 문자(디렉토리의 경로 이름)로 끝나는 경우에도 문제가 발생할 수 있습니다. 그러면 정렬 열에 빈 문자열이 생성됩니다.

또한보십시오:슈워츠 변환

답변2

GNU awk( gawk)를 사용하여 배열 순회를 지정합니다.

awk -F'/' 'BEGIN {PROCINFO["sorted_in"] = "@ind_str_asc"} 
           { a[$NF]=$0 }
           END { for ( i in a ) { print a[i] } }' files.txt

이 경우 데이터는 배열에 로드되고 인덱스는 마지막으로 구분된 필드(예: 파일 이름)로 정의되며 /요소는 파일의 행입니다. 그런 다음 인쇄 단계의 인덱스 값으로 정렬된 배열을 반복합니다.


기본 유틸리티만:

paste <(rev files.txt | cut -d'/' -f 1 | rev) files.txt  | sort | cut -f2

관련 정보