정렬 명령에서 KEYDEF는 어디에 있습니까?

정렬 명령에서 KEYDEF는 어디에 있습니까?

다양한 상황에서 "du" 명령의 결과를 파일이나 폴더 이름, 파일 크기 또는 마지막 수정 시간별로 정렬하고 "du" 명령 뒤에 "|"를 추가해야 합니다. sort -k 2' 명령을 파일 클립 이름별로 정렬해야 합니다. 이것이 내가 이 질문에서 배운 것입니다. du 명령을 사용하여 파일 이름별로 정렬

sort 명령 매뉴얼(RHEL 7.6)에는 -k, --key=KEYDEF가 키별로 정렬한다고 기록되어 있습니다. KEYDEF는 F[.C][OPTS][,F[.C]입니다. [OPTS] ]는 시작 및 중지 위치를 나타냅니다. 여기서 F는 필드 번호이고 C는 필드의 문자 위치입니다.

하지만 아직도 그 의미를 이해하지 못합니다.

F=2는 파일 이름을 참조합니까? 그렇다면 파일 크기 또는 마지막 수정 시간에 대한 F는 무엇입니까? 그렇다면 "KEYDEF"는 어디서 찾을 수 있나요?

나는 이 문서를 주의 깊게 읽었습니다. https://www.gnu.org/software/coreutils/manual/html_node/sort-inspiration.html 하지만 아직도 정보를 찾을 수 없습니다.

답변1

F는 필드 번호이며 기본적으로 sort명령은 필드를 공백으로 둘러싸인 텍스트로 정의합니다. -b 및 -t 옵션은 기본값을 변경할 수 있습니다. 참조하는 문서에는 로케일 등을 기반으로 필드 구분 기호를 지정하는 세부 사항에 대한 길고 머리 아픈 설명이 포함되어 있습니다.

"F 파일 크기나 마지막 수정 시간은 무엇입니까?"라고 묻습니다. sort파일 크기나 수정 시간에 대한 개념이 없습니다. 목표는 필터링된 출력이므로 명령을 du실행 하고 필드 수를 계산합니다.du

예를 들어 du옵션 없이 실행하면 한 줄에 두 개의 필드(크기 및 파일/디렉터리 이름)가 표시됩니다.

$ du . 
8       ./ruby
4       ./nextcloud/data/nextcloud
12      ./nextcloud/data/database/nextcloud
4       ./nextcloud/data/database/performance_schema
4       ./nextcloud/data/database/mysql
... etc ...

현재 디렉터리 아래의 파일과 디렉터리를 정렬해야 하는 경우 기본적으로 첫 번째 필드를 기준으로 정렬되므로 du . | sort -n이 문제를 해결할 수 있습니다 . sort영숫자순이 아닌 숫자순으로 정렬하려면 -n 옵션이 필요합니다.

$ du . | sort -n 
4       ./bitwarden/data/icon_cache
4       ./.cache/obexd
4       ./.cache/pip/wheels/2c/4a/61/5599631c1554768c6290b08c02c72d7317910374ca602ff1e5
4       ./.cache/pip/wheels/33/56/20/ebe49a5c612fffe1c5a632146b16596f9e64676768661e4e46
4       ./.cache/pip/wheels/88/a7/30/e39a54a87bcbe25308fa3ca64e8ddc75d9b3e5afa21ee32d57
4       ./.cache/pip/wheels/fc/a8/66/24d655233c757e178d45dea2de22a04c6d92766abfb741129a
... etc ...

-r을 추가하면 큰 파일을 먼저 표시할 수 있습니다.

경로 이름으로 정렬:

du . | sort -k 2

파일 이름(예: 경로 이름의 마지막 구성 요소)별로 정렬하는 빠른 솔루션이 없습니다. sort어느 하위 필드가 파일 이름인지 파악해야 하고 하위 필드 번호가 다양하기 때문에 혼자서는 이 작업을 수행할 수 없다고 생각합니다 . 다음은 부분적인 해결 방법입니다(슬래시가 포함된 경로 이름에서만 작동함).

$ du . | sed 's|\(.*\)/\(.*\)|\1/\2 \2|' | sort -k3
5639116 .
12      ./.cache/pip/http/9/8/7/0 0
12      ./.cache/pip/http/9/c/b/c/0 0
12      ./.cache/pip/http/c/0/4/0/0 0
12      ./.cache/pip/http/f/0/3/0 0
12      ./.cache/pip/http/f/e/d/0 0
136     ./.cache/pip/http/4/8/d/7/0 0
164     ./.cache/pip/http/a/0 0
16      ./.cache/pip/http/0/0/9/7/0 0
16      ./.cache/pip/http/2/8/0 0
... etc ...

du명령이 수정 시간을 인쇄 하도록 하는 옵션 조합이 있는지는 모르겠습니다 . 그렇다면 알려주시면 어느 지역인지 알려드리겠습니다.

관련 정보