항목 수에 따라 ls 명령이 다르게 동작하도록 만들기

항목 수에 따라 ls 명령이 다르게 동작하도록 만들기

나열될 수 있는 디렉토리 항목 수에 따라 ls 명령이 다르게 작동하도록 할 수 있습니까?

방금 사용하는 경우 ls(수정 옵션은 없지만 디렉터리나 필터를 지정할 수 있음) 다음을 원합니다.

  • -l항목 수가 10개 이하인 경우 긴 목록 형식을 사용합니다.
  • 처음 50개 항목만 표시하고 경고를 출력합니다.x more entries

가능합니까? 어떻게 해야 하나요?

사용자 정의 스크립트를 사용하여 사용자 정의 명령 으로 전환 하고 싶지는 않습니다. 사용자 정의 스크립트나 래퍼를 사용할 수 있지만 여전히 ls이를 수행하고 전체 기능을 유지하는 데 사용하고 싶습니다 . 즉, 단순히 스크립트/래퍼를 my-custom-ls호출하는 것이 아닙니다.ls

답변1

사용자 정의 스크립트 명령/래퍼 함수가 필요하지 않은 경우 사용자 정의 바이너리 명령이 필요합니다. GNU ls소스 코드는 다른 구현과 마찬가지로 사용 가능합니다.

자신만의 패치 버전을 생성 ls하면 됩니다.

이 동작 변경으로 인해 POSIX 규정 준수가 중단됩니다.

편집(수정된 질문에 따라):

ls() {
    if [ $(command ls "$@" | wc -l) -gt 10 ]; then
        command ls "$@" | head -50
    else
        command ls -l "$@"
    fi
}

남은 항목 수를 표시하는 향상된 버전:

ls() {
    [ ! -t 1 ] && { command ls "$@" ; return ; }
    r=$(command ls "$@")
    lines=$(printf "%s" "$r" | wc -l)
    if [ $lines -gt 10 ]; then
        printf "%s" "$r" | head -50
        if [ $lines -gt 50 ]; then
          printf "%d more entries\n" $((lines - 50))
        fi
    else
        command ls -l "$@"
    fi
}

답변2

ls(1)인수를 계산하고 올바른 인수로 호출하는 고유한 스크립트(예: Python)를 생성하고 more(1)필요에 따라 페이지를 매깁니다(출력이 tty로 이동하는 경우).

답변3

ls 자체를 재정의할 수는 없지만 "ls2"와 함께 이 함수를 사용할 수 있습니다.

ls2 () {
  num_of_files=`ls | grep "\/$" | wc -l`
  if [ "$num_of_files" -gt "10" ]; then
    ls | less
  else
    ls -l
  fi  
}

grep을 사용하여 디렉터리를 찾은 다음 wc(줄 수 옵션이 있는 unix 단어 개수 함수)를 사용하여 디렉터리 수를 계산하는 사용자 정의 명령 ls2를 만듭니다. "10" 비교에서 파일 수를 변경할 수 있습니다. ls -l및/또는 명령을 변경하여 ls -a실제로 수행되는 작업을 변경할 수 있습니다.

Bash 함수를 처음 사용하는 경우 - 코드를 파일에 넣은 다음 chmod +x파일을 실행 가능하게 만든 다음 파일을 실행하고 . the_filename함수를 사용하십시오 .ls2

영구적인 해결 방법을 찾으려면 파일에 기능을 추가하고 파일을 다루기 어렵게 만들지 않고도 한 곳에서 더 많은 기능을 추가할 수 있도록 파일에서 파생된 파일을 .bashrc만드는 것을 고려하십시오 ..bashrc.bashrc

항목을 한 번 이상 표시할 수 없습니다.

답변4

이것이 문제에 대한 나의 설명입니다. 배열을 사용하기 때문에 bash에만 해당됩니다. 이는 호출된 함수를 정의합니다 (따라서 실행 방식을 지우려면 ls실행해야 합니다 ). 이 함수는 주어진 인수의 배열(또는 인수가 제공되지 않은 경우 현재 디렉토리의 내용 배열)을 생성합니다. 그런 다음 사용할 플래그를 결정하기 위해 이러한 요소를 계산합니다(10보다 작으면 를 사용하고 , 그렇지 않으면 ). 파일이 50개보다 많으면 처음 50개만 표시되고 메시지가 표시됩니다. 또한 출력이 화면에 출력되지 않을 때 함수가 더 정상적으로 작동하도록 하기 위해 Kevin/jlliagre의 아이디어를 뻔뻔하게 복사했습니다 .unalias lslslsls -ldls -dls

이는 플래그가 real 에 전달되는 것을 허용하지 않으며 ls특별한 -r주의 -a가 필요합니다.

function ls {
  _ls_longlimit=10
  _ls_cutoff=50
  declare -a _ls_files

  [ ! -t 1 ] && { command ls "$@"; return; }
  # TODO: skip past any "-rtxyz" options
  if [ $# -eq 0 ]
  then
    _ls_files=(*)
  else
    for a in "$@"
    do
      if [ -d "$a" ]
      then
        # add "${a}/*" to array
        _ls_files+=("${a}"/*)
      else
        # add $a to array
        _ls_files+=("$a")
      fi
    done
  fi
  if [ ${#_ls_files[@]} -le $_ls_longlimit ]
  then
    command ls -ld "${_ls_files[@]}"
  else
    # -1 because arrays are 0-based
    command ls -d "${_ls_files[@]:0:_ls_cutoff - 1}"
  fi
  if [ ${#_ls_files[@]} -gt $_ls_cutoff ]
  then
    echo $((${#_ls_files[@]} - _ls_cutoff)) more entries
  fi
}

관련 정보