클래스/표시자(예: ls --classify)와 이름별로 파일을 나열하려면 어떻게 해야 합니까?

클래스/표시자(예: ls --classify)와 이름별로 파일을 나열하려면 어떻게 해야 합니까?

ls --clasify*/=>@|항목에 표시기( 중 하나 )를 추가합니다. 동일한 카테고리/측정항목의 항목을 그룹화하고 싶습니다.

ls --group-directories-first그룹화해서 만 찾을 수 있는데 /,실행 파일 *, 심볼릭 링크 @, 파이프 및 소켓을 |그룹화하는 방법은 무엇입니까 =?

ls아니요필수입니다. 더러운 해커라면 누구나 환영합니다. 그러나 출력 스타일에 관해서는 수행된 작업과 유사하게 표시기가 있는 다중 열 컬러 출력을 원합니다 ls -C --color -F.

답변1

ls -CFUd같은 것을 사용하세요무루하지만 에서는 zsh다음을 시도해 볼 수 있습니다.

(set -o nullglob; ls --color -CFUd -- *(/) *(*) *(@) *(p) *(=) *(^/*@p=))

(...)어디글로벌 예선디렉토리, 실행 파일, 심볼릭 링크, 파이프, 소켓 및 기타 모든 것과 일치합니다.

bytype정렬 기능을 다음과 같이 정의 할 수도 있습니다 .

zmodload -F zsh/stat b:zstat
bytype() {
  local mode order=(d l p s b c)
  zstat -sLA mode +mode -- $REPLY
  REPLY=$order[(ie)${mode[1][1]}]$REPLY
}
ls --color -CFUd -- *(o+bytype)

이는 패턴 텍스트 표현의 첫 번째 문자( ls -l출력의 첫 번째 필드) 를 기준으로 정렬되므로 -일반 파일, l심볼릭 링크 등의 경우 배열에서 순위가 ​​조회됩니다 $order.

실행 파일은 파일 형식이 아니므로 특별히 취급되지 않습니다. ls -F또는 glob 한정자 의 경우 *실행 파일은 다음과 같습니다.정기적인권한에 하나 이상의 실행 비트가 설정된 파일(실행 권한이 있으므로 다음과 같은 방법으로 처리할 수 있습니다.

zmodload -F zsh/stat b:zstat
bytype() {
  local mode order=(d '*' l p s b c)
  zstat -sLA mode +mode -- $REPLY
  if [[ $mode = -*[xts]* ]] mode=('*')
  REPLY=$order[(ie)${mode[1][1]}]$REPLY
}

답변2

더티 해킹이 널리 사용된다면 다음과 같은 상황이 발생할 수 있습니다.

ls -C --color -F -1 | rev | sort | rev

기본적으로:

  • rev마지막 문자를 먼저 가져옵니다.
  • 그러면 sort이제 마지막 문자가 먼저 사용됩니다.
  • 그런 다음 rev원래 행을 다시 가져옵니다.

불행히도 단일 열 출력이 있습니다. 이를 적용하여 다중 열 출력을 얻을 수 있지만 column인쇄되지 않는 문자로 인해 열이 왜곡됩니다.

$ ls -C --color -F /proc/self/ -1 | rev | sort -i | rev | column -x
fd/     task/       fdinfo/ attr/   ns/     net/        cwd@
exe@        root@       sched           cmdline         oom_score       oom_score_adj       oom_adj
stack           syscall         mem         comm            statm           wchan           environ
mountinfo       io          pagemap         cgroup          autogroup       coredump_filter     clear_refs
maps            numa_maps       smaps           mountstats      limits          mounts          status
stat            schedstat       cpuset          auxv            personality

물론 몇 가지 주의사항이 있습니다.

  • 파일 이름에 개행 문자가 없습니다.
  • ls파일 이름에 표시 문자가 없습니다.

findbash 함수를 사용하여 sort자체적으로 결합하면 ls결과가 매우 유사합니다.

lsc () (
    [[ -z $1 ]] && set .
    for path
    do
        [[ -d $path ]] || { ls -CF --color "$path"; echo; continue; }
        (( $#  > 1 )) && printf '%s:\n' "$path" 
        find "$path" -maxdepth 1 -mindepth 1 ! -iname '.*' -printf "%y %p\0" |
        while IFS= read -d '' -r entry
        do
            ftype="${entry:0:1}"
            fname="${entry:2}"
            [[ $ftype == f && -x $fname ]] && ftype=x
            printf "$ftype $fname\0"
        done | sort -z -k1 | 
        sed -z 's/^. //; s:.*/::' |
        xargs -0 bash -c 'cd "$0"; ls -CFUd --color "$@"' "$path"
        (( $#  > 1 )) && echo
    done
)

기본적으로 사용하면 ls여러 열로 인쇄하는 것이 더 쉬워집니다.

답변3

l='ls -F --color'  
paste -d: <($l | grep '/$') <($l | grep '*$') <($l | grep '@$') <($l | grep -v '[/@*]$') |
tac| column -t -s ":" -N FOLDERS,EXECUTABLES,LINKS,OTHER

여기에 이미지 설명을 입력하세요.

관련 정보