Linux 프로그램 "sort"는 파일이나 다른 프로그램의 출력을 정렬할 수 있습니다. sort를 사용하여 ls 명령의 출력을 1) 파일 이름 2) 파일 크기별로 정렬하는 방법입니다.
"ls" 명령에 이 작업을 수행할 수 있는 몇 가지 옵션이 있다는 것을 알고 있지만 다음과 같은 정렬을 사용해 보았습니다. "ls" 명령은 크기를 표시하고 "sort" 명령 옵션은 정렬을 제어한 다음 파이프를 사용했습니다.
이 목표를 어떻게 달성할 수 있나요?
답변1
그리고GNU 구현stat
1, 파일 이름에 개행 문자가 포함되어 있지 않고 -
현재 디렉터리에서 호출되는 파일이 없다고 가정합니다.
stat -c '%s %n' -- * | sort -t' ' -k1,1n -k2
정렬 키:
- 먼저 필드 1(크기)을 기준으로 숫자순(오름차순)으로 정렬합니다.
- 다음 필드 2-끝(파일 이름) 어휘(오름차순)
¹ stat
이는 표준 명령이 아니며 호환되지 않는 구현이 여러 개 있다는 점에 유의하세요.
답변2
Unix 계열 시스템의 파일 이름은 0 및 인코딩을 제외하고 하나 이상의(일반적으로 특정 제한까지) 바이트의 시퀀스입니다 /
.
sort
행 정렬, 즉 0 이상의 배열(일부 구현에서는 특정 한도까지)수치기타 및 개행 문자(및 일부 구현의 경우 NUL)는 명령줄에 제공된 정렬 키 사양을 기반으로 합니다.
GNU 구현(및 해당 복제본)은 sort
표준 확장으로 입력 시 NUL을 처리할 수 있으며 행 대신 NUL로 구분된 레코드를 정렬할 수도 있습니다( options 사용 -z
).
C
로케일을 다음으로 수정하면(실제로 현지화를 비활성화한 경우) byte == 문자 맵을 가질 수 있습니다.
ls
예를 들어 ast-open의 구현을 통해 다음과 같은 결과를 얻을 수 있습니다.
ls --format='%(size)d\t%(name)s'
그러나 이것은 NUL로 구분된 레코드가 아닌 줄바꿈으로 구분된 레코드이므로 줄바꿈은 파일 이름의 모든 문자만큼 유효하기 때문에 작동하지 않습니다.
NUL을 얻기 위해 in을 사용할 수는 없지만 \0
다음과 같이 할 수 있습니다.
ls --format='%(size)d\t%(name)s/'
GNU의 도움으로 이러한 구분 기호를 GNU의 NUL 구분 기호로 변환 awk
할 수 있습니다 ./<newline>
sort -z
ls --format='%(size)d\t%(name)s' |
LC_ALL=C gawk -v 'RS=/\n' -v 'ORS=\0' 1 |
LC_ALL=C sort -zn |
LC_ALL=C tr '\0' '\n'
( tr
결국 디스플레이 전용).
GNU를 사용하면 ast-open( 또는 이를 수행하는 GNU 도구 상자의 도구)을 ls
사용하여 출력 형식을 지정할 수 없지만 버전 9.0부터 이 옵션을 사용하여 NUL로 구분된 레코드를 출력할 수 있습니다.find
stat
--zero
그리고:
LC_ALL=C ls -go --zero
다음과 같은 출력을 얻게 됩니다.
<mode><spaces><links><spaces><size><space><t1><spaces><t2><spaces><t3><space><name><NUL>
따라서 크기와 이름을 추출할 수 있습니다.
그러나 이것이 모든 유형의 파일에 적용되는 것은 아닙니다.
- 심볼릭 링크의
<name>
경우<name><space>-><space><target-path>
<size>
<major>,<spaces><minor>
장치 파일의 경우 장치 번호를 대신 받게 됩니다 .
GNU에는 출력에서 각 파일 이름이 시작하고 끝나는 위치에 대한 정보와 함께 의 출력을 제공하는 옵션 ls
도 있습니다 . 이는 심볼릭 링크에는 도움이 되지만 장치 파일에는 도움이 되지 않으며 오프셋을 사용하여 추가 정보를 얻고 정렬에 적합한 형식으로 다시 포맷하려면 추가 작업이 필요합니다 .--dired
emacs
//DIRED//
의 출력은 ls
사후 처리용으로 전혀 사용되지 않습니다.
대신 다음을 사용할 수 있습니다.
zsh
어떤 기준으로든 정렬할 수 있는 글로브- GNU
find
와 그-printf
술어 - zsh, BSD 또는 GNU
stat
(호환되지 않는 API 포함) stat()
또는 // ... API와 내장된 정렬 도구를 갖춘 Perl, Ruby 또는 Python과 같은 더 높은 수준의 프로그래밍 언어입니다 .lstat()
statx()