ls: 하나만 패턴과 일치하는 경우 디렉터리 이름 표시

ls: 하나만 패턴과 일치하는 경우 디렉터리 이름 표시

패턴과 일치하는 파일을 표시하는 데 사용하는 경우 ls일치하는 항목이 여러 개 있으면 내용과 함께 디렉터리 이름을 표시하지만 일치하는 항목이 하나만 있으면 디렉터리 이름을 생략합니다. 예는 다음과 같습니다.

example % ls
bar     barbados    foo

example % ls b*
bar:
1   2

barbados:
1   2

example % ls f*
1   2

예제에서 b*두 디렉터리와 일치하는 것으로 시작하는 모든 파일을 요청하면 출력에 두 디렉터리의 이름과 해당 콘텐츠가 표시됩니다.

요청하면 f*출력에 일치하는 단일 디렉터리의 내용이 표시되지만 디렉터리 이름은 생략됩니다.

ls단일 디렉터리만 일치하는 경우 일치하는 디렉터리의 이름을 표시하도록 구성하려면 어떻게 해야 합니까 ?

답변1

가능한 해결 방법은 래퍼 함수일 수 있습니다.

dls() {
    if [ "$#" -eq 1 ] && [ -d "$1" ]; then
        printf '%s:\n' "$1"
    fi
    ls -- "$@"
}
  • 위 함수는 인수로 전달되는 옵션을 허용하지 않습니다.
  • 단순히 다음 사항을 확인합니다.
    1. 주장은 하나뿐이다
    2. 인수는 디렉토리입니다

이 두 조건이 true인 경우 내용을 나열하기 전에 디렉터리 이름을 인쇄합니다.


% dls f*
foo:
1   2

일부 구현에서는 공백이나 기타 특수 문자가 포함된 경우 최신 버전의 GNU와 유사한 방식으로 디렉토리 이름을 로 바꿀 printf수 있습니다 .%s%qls

답변2

예제를 사용하면 을 실행하면 ls b*셸이 b*으로 확장되므로 bar barbados실제로 ls bar barbados. 인수가 여러 개인 ls경우 그 중 하나가 디렉터리이면 이름과 디렉터리의 파일 목록이 인쇄됩니다.

을 실행하면 ls f*쉘이 f*으로 확장 foo되므로 실제로 가 실행됩니다 ls foo. 단일 인수가 있는 경우 ls해당 인수가 디렉터리인 경우 디렉터리 이름 없이 디렉터리에 있는 파일 목록을 인쇄합니다.

ls원하는 것을 수행하는 "좋은" 방법은 없습니다 (적어도 내가 아는 바는 아니고 다른 사람이 더 잘 알 수도 있음). "좋지 않은" 방법 중 하나는 존재하지 않을 것이라는 추가 인수를 포함시킨 다음 존재하지 않는 파일과 관련된 오류 출력을 필터링하는 것입니다. 출력을 구문 분석하는 것은 나쁜 생각이라는 점을 기록해 두겠습니다 ls. 하지만 도움이 될 경우를 대비하여 다음을 제공하겠습니다.

$ function dls() {
    if [[ $# -eq 0 ]]; then
        ls
    else
        ls ${@} this-file-does-not-exist-anywhere 2> >(grep -v this-file-does-not-exist-anywhere)
    fi
}

$ dls
foo

$ dls f*
foo:
1  2

이와 같은 작업을 수행하면 의도하지 않은 결과가 발생할 수 있습니다(예: 평소처럼 표준 오류 메시지를 리디렉션하지 못할 수 있음).

답변3

대부분의 사람들이 매번 사용하는 매개변수를 사용하세요 -al. ls그러면 dirname에 후행 슬래시를 추가할 때까지 그렇게 하지 않습니다. 다른 매개변수는 입니다 -d. 그러면 어떤 식으로든 하강하지 않습니다.

영구적으로 사용하려면 .bashrc홈 디렉터리에 다음을 추가하세요.

alias lsd='ls -d' ;

lsd나중에 이 명령을 사용할 수 있습니다 .

관련 정보