ls-lS 명령 없이 파이프를 사용하여 목록 정렬

ls-lS 명령 없이 파이프를 사용하여 목록 정렬

Linux 프로그램 "sort"는 파일이나 다른 프로그램의 출력을 정렬할 수 있습니다. sort를 사용하여 ls 명령의 출력을 1) 파일 이름 2) 파일 크기별로 정렬하는 방법입니다.

"ls" 명령에 이 작업을 수행할 수 있는 몇 가지 옵션이 있다는 것을 알고 있지만 다음과 같은 정렬을 사용해 보았습니다. "ls" 명령은 크기를 표시하고 "sort" 명령 옵션은 정렬을 제어한 다음 파이프를 사용했습니다.

이 목표를 어떻게 달성할 수 있나요?

답변1

그리고GNU 구현stat1, 파일 이름에 개행 문자가 포함되어 있지 않고 -현재 디렉터리에서 호출되는 파일이 없다고 가정합니다.

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로 구분된 레코드를 출력할 수 있습니다.findstat--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도 있습니다 . 이는 심볼릭 링크에는 도움이 되지만 장치 파일에는 도움이 되지 않으며 오프셋을 사용하여 추가 정보를 얻고 정렬에 적합한 형식으로 다시 포맷하려면 추가 작업이 필요합니다 .--diredemacs//DIRED//

의 출력은 ls사후 처리용으로 전혀 사용되지 않습니다.

대신 다음을 사용할 수 있습니다.

  • zsh어떤 기준으로든 정렬할 수 있는 글로브
  • GNU find와 그 -printf술어
  • zsh, BSD 또는 GNU stat(호환되지 않는 API 포함)
  • stat()또는 // ... API와 내장된 정렬 도구를 갖춘 Perl, Ruby 또는 Python과 같은 더 높은 수준의 프로그래밍 언어입니다 .lstat()statx()

관련 정보