디렉토리인 경우 명령은 내용을 나열하고, 파일인 경우 내용을 출력합니까?

디렉토리인 경우 명령은 내용을 나열하고, 파일인 경우 내용을 출력합니까?

디렉토리를 전달할 때 내용을 나열하지만 파일인 경우 내용을 출력하는 명령이 있습니까?

예를 들어, 일반적으로 디렉토리 구조를 검색할 때 다음과 같은 내용을 입력하기 시작합니다.

ll /etc/path/  # I see a file in tab-completion that interests me, called myfile.txt
ll /etc/path/myfile.txt  # I do the auto-completion to get it into the command line
less /etc/path/myfile.txt  # Now I have to go back and change 'll' to 'less'

또는 파일을 찾고 있다면 먼저 시작하겠습니다.

less /etc/path  # I see in tab-completion several files that might interest me, so I need to know more
ll /etc/path  # See more info about file sizes, etc, so I can choose the file I want. Have to change 'less' to 'll'
less /etc/path/myfile.txt  # Now that I know which file I want, I have to go back and change 'll' to 'less'

이것은 내가 하루에도 수십 번씩 하는 일이고, 그러다 보니 속도가 느려지기 시작합니다. 가장 가능성이 높은 시나리오를 만족시킬 수 있는 명령이나 스크립트가 있습니까? 예를 들어

some-program /etc/path/to/file/or/directory

대상이 텍스트 파일이거나 텍스트 파일에 대한 심볼릭 링크인 경우 "less /etc/path/to/....."가 실행됩니다. 그러나 디렉터리, 바이너리 파일, 블록 장치와 같은 다른 것이라면 "ll /etc/path/to/..."를 수행합니다.

물론 파일 심볼릭 링크의 "less"와 같이 원하지 않는 작업을 수행하지만 "ll"을 사용하여 심볼릭 링크 자체를 보려면 수동으로 "ll"을 실행할 수 있습니다.

그런 일이 존재합니까(아마도 거기에 있을 것입니다. 일반적인 작업인 것 같습니다)? 아니면 제가 Linux 명령줄을 비효율적인 방식으로 사용하고 있는데 이를 탐색하는 더 좋은 방법이 있을 수도 있습니다... 어떻게 그렇게 하셨나요? 아니면 명령줄에서 "less"와 "ll" 사이를 계속 왔다 갔다 하고 다시 돌아가는 유일한 사람인가요?

some-program() {
  if [[ $# > 1 ]]; then
    echo "Only one argument supported at this time"
  exit 1
  fi
  if [[ $# == 0 ]]; then
    ELEMENT="."
  else
    ELEMENT="$1"
  fi
  if [[ -d $ELEMENT ]]; then
    ls --color=auto -alF "$ELEMENT"
  else
    less "$ELEMENT"
  fi
}

답변1

less이와 같은 작업을 수행할 수 있는 매우 깔끔한 내장 함수가 있습니다. lesspipe매뉴얼 페이지를 참조하십시오 .

이 기능을 사용하여 디렉토리의 디렉토리 목록을 자동으로 표시하려면:

  1. lesspipe매뉴얼 페이지를 따라 설정하십시오.eval "$(lesspipe)"

  2. ~/.lessfilter다음을 사용하여 생성하고 실행 가능하게 만듭니다.

    #!/bin/sh
    if [ -d "$1" ]; then
        ls -alF "$1"
    else
        # We don't handle this format.
        exit 1
    fi
    exit 0
    

lesspipe그러면 파일 형식을 처리하기 위해 실행 중인 필터 스크립트가 설정됩니다 . 보려는 것이 디렉터리인지 확인하고, 디렉터리이면 ls실행합니다.

귀하의 초기 요청에는 색상이 포함되어 있습니다. 안타깝게도 less기본적으로 색상이 표시되지 않고 필터 스크립트의 출력이 여전히 파이프로 연결되기 때문에 이는 약간 어렵습니다 less. -R이를 수행하려면 기본 옵션(바이너리를 살펴본 경우에는 좋은 생각이 아닐 수 있음)을 사용해야 합니다 . lessfilter 스크립트에 less새 옵션을 추가하도록 지시하는 방법이 없다고 생각합니다 .

관련 정보