패턴과 일치하는 파일을 표시하는 데 사용되는 경우 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
그러면 디렉터리 이름에 후행 슬래시를 추가할 때까지 이 작업이 수행되지 않습니다. 또 다른 매개변수는 입니다 -d
. 그러면 어떤 식으로든 작동이 중단되지 않습니다.
영구적으로 유지하려면 .bashrc
홈 디렉터리에 다음을 입력하세요.
alias lsd='ls -d' ;
lsd
나중에 이 명령을 사용할 수 있습니다.