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그러면 디렉터리 이름에 후행 슬래시를 추가할 때까지 이 작업이 수행되지 않습니다. 또 다른 매개변수는 입니다 -d. 그러면 어떤 식으로든 작동이 중단되지 않습니다.

영구적으로 유지하려면 .bashrc홈 디렉터리에 다음을 입력하세요.

alias lsd='ls -d' ;

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

관련 정보