![ls: 하나만 패턴과 일치하는 경우 디렉터리 이름 표시](https://rvso.com/image/168781/ls%3A%20%ED%95%98%EB%82%98%EB%A7%8C%20%ED%8C%A8%ED%84%B4%EA%B3%BC%20%EC%9D%BC%EC%B9%98%ED%95%98%EB%8A%94%20%EA%B2%BD%EC%9A%B0%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%20%EC%9D%B4%EB%A6%84%20%ED%91%9C%EC%8B%9C.png)
패턴과 일치하는 파일을 표시하는 데 사용하는 경우 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 -- "$@"
}
- 위 함수는 인수로 전달되는 옵션을 허용하지 않습니다.
- 단순히 다음 사항을 확인합니다.
- 주장은 하나뿐이다
- 인수는 디렉토리입니다
이 두 조건이 true인 경우 내용을 나열하기 전에 디렉터리 이름을 인쇄합니다.
% dls f*
foo:
1 2
일부 구현에서는 공백이나 기타 특수 문자가 포함된 경우 최신 버전의 GNU와 유사한 방식으로 디렉토리 이름을 로 바꿀 printf
수 있습니다 .%s
%q
ls
답변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
나중에 이 명령을 사용할 수 있습니다 .