- 지정되면
ls --directory a*
다음으로 시작하는 디렉토리만a*
- 그러나 다음으로 시작하는 파일과 디렉토리가 나열됩니다.
a
질문:
man
내가 철저하게 살펴본 문서 외에 이 문제에 대한 문서를 어디에서 찾을 수 있습니까info
?- 이것은 BASH에만 적용됩니까?
답변1
a*
및 구문은 명령 *a*
이 아닌 셸에 의해 구현됩니다 .ls
입력하는 대로
ls a*
쉘 프롬프트에서 쉘은 a*
현재 디렉토리의 이름으로 확장됩니다 a
. 예를 들어 a*
시퀀스로 확장하여 a1 a2 a3
인수로 전달할 수 있습니다 ls
. 명령 자체는 역할을 ls
볼 수 없으며 , 및 세 개의 매개변수만 볼 수 있습니다 .*
a1
a2
a3
와일드카드 확장의 경우 "파일"은 현재 디렉터리의 모든 엔터티를 나타냅니다. 예를 들어 a1
일반 파일, a2
디렉터리 또는 a3
기호 링크가 될 수 있습니다. 이들은 모두 디렉토리 항목을 갖고 있으며 쉘의 와일드카드 확장은 해당 항목이 참조하는 엔터티 유형이 무엇인지 상관하지 않습니다.
실제로 접할 수 있는 모든 쉘(bash, sh, ksh, zsh, csh, tcsh...)은 와일드카드를 구현합니다. 세부 사항은 다를 수 있지만 *
0개 이상의 문자와 ?
단일 문자를 일치시키는 기본 구문은 상당히 일관됩니다.
특히 bash의 경우 이는 bash 매뉴얼의 "파일 이름 확장" 섹션에 설명되어 있으며 info bash
"파일 이름 확장"을 실행하고 검색하거나 확인하십시오.여기.
이것이 단일 명령이 아닌 쉘에 의해 수행된다는 사실은 몇 가지 흥미로운(때로는 놀라운) 결과를 가져옵니다. 가장 좋은 점은 와일드카드 처리가 (거의)모두명령; 쉘이 이 작업을 수행하지 않으면 필연적으로 일부 명령은 문제가 되지 않지만 다른 명령은 작성자가 "더 나은" 것으로 간주하는 미묘하게 다른 방식으로 수행됩니다. (내 생각엔 Windows 명령 셸에 이 문제가 있는 것 같지만 더 이상 설명할 만큼 익숙하지 않습니다.)
반면에 여러 파일의 이름을 바꾸는 명령을 작성하는 것은 어렵습니다. 당신이 쓰는 경우 :
mv *.log *.log.bak
*.log.bak
현재 디렉터리에 이미 존재하는 파일을 기반으로 확장 중이므로 실패할 수 있습니다 . 이러한 작업을 수행할 수 있는 명령이 있지만 파일 이름을 바꾸는 방법을 지정하려면 고유한 구문을 사용해야 합니다. 일부 명령(예: find
)은 자체 와일드카드 확장을 수행할 수 있습니다. 셸 확장을 억제하려면 인수를 인용해야 합니다.
find . -name '*.txt' -print
셸의 와일드카드 확장은 전적으로 명령줄 인수 구문과 기존 파일 세트를 기반으로 합니다. 그것할 수 없다명령의 의미에 영향을 받습니다. 예를 들어 .log
모든 파일을 상위 디렉터리로 이동 하려면 다음을 입력하면 됩니다.
mv *.log ..
잊어버린 경우 ..
:
mv *.log
.log
현재 디렉터리에는 정확히 두 개의 파일이 있으며 다음과 같이 확장됩니다.
mv one.log two.log
이렇게 하면 이름이 바뀌고 one.log
중단됩니다 two.log
.
편집하다: 찬성 52개, 수락 1개, 마스터 배지를 받은 후에 실제로 제목의 질문에 답해야 할 것 같습니다.
-d
또는 옵션은 디렉토리만 나열하도록 지시 --directory
하지 않습니다 . ls
디렉토리의 내용이 아닌 디렉토리처럼 디렉토리를 나열하도록 지시합니다. 디렉터리 이름을 매개변수로 제공하면 ls
기본적으로 디렉터리 이름이 나열됩니다.콘텐츠일반적으로 관심이 있는 디렉토리 이름입니다. 이 -d
옵션은 디렉토리 자체만 나열하도록 지시합니다. 이는 와일드카드와 결합할 때 특히 유용합니다. 다음을 입력하는 경우:
ls -l a*
ls
각각의 긴 목록을 줄 것입니다문서a
로 시작하는 이름 ,콘텐츠로 시작하는 모든 디렉토리 a
. 파일 및 디렉터리 목록(각각 한 줄)을 원하는 경우 다음을 사용할 수 있습니다.
ls -ld a*
이는 다음과 같습니다.
ls -l -d a*
다시 말하지만, ls
이 문자는 이 명령으로 표시되지 않습니다 *
.
문서화된 위치에 관해서는 거의 모든 Unix 계열 시스템에서 man ls
이 명령에 대한 문서가 표시됩니다. ls
대부분의 Linux 기반 시스템에서 이 ls
명령은 GNU coreutils 패키지의 일부입니다. info
명령이 있는 경우 더 명확하고 포괄적인 문서가 제공되거나 info ls
제공 되어야 합니다. info coreutils ls
MacOS와 같은 다른 시스템에서는 이러한 시스템에 대해 다른 버전의 명령을 사용할 수도 있고 사용 하지 ls
않을 수도 있습니다 .info
man ls
ls --help
비교적짧은 사용법 메시지(내 시스템에서는 117줄)만약에GNU coreutils 구현을 사용하고 있습니다.
예, 전문가라도 때때로 문서를 참조해야 합니다. 당신은 또한 볼 수 있습니다이 고전적인 농담.
답변2
Keith Thompson의 답변을 참조하고 ls --directory a*
파일이 표시되는 이유를 설명하십시오.그리고디렉터리: 이 --directory
옵션은 디렉터리가 아닌 파일을 억제하지 않습니다. 대신 디렉토리를 있는 그대로 나열합니다. 그렇지 않으면 해당 내용이 나열됩니다. 예:
$ mkdir foo
$ touch foo/bar
$ ls foo
bar
$ ls --directory foo
foo
답변3
매우 명확하게 하기 위해 다음 문서에 문서화되어 있습니다.ls(1) 매뉴얼 페이지:
-d, --디렉토리 내용 대신 디렉터리 항목을 나열하고 기호 링크를 역참조하지 않습니다.
공평하게 말하면 "내용보다는 항목"이 더 설명적일 수 있습니다.
FILE이 디렉터리인 경우 디렉터리 내용을 나열하는 대신 디렉터리 항목 자체가 표시됩니다. FILE이 심볼릭 링크인 경우 링크가 가리키는 파일이 아닌 링크 항목 자체가 표시됩니다.
답변4
문서에는 목록이 나와 있지 않습니다.오직디렉토리 항목 대신 ls
디렉토리 이름을 받으면 디렉토리 항목을 나열합니다.바꾸다이것이 내용입니다. 이해하는 가장 좋은 방법은 예를 통해서입니다.
> {ice} ~ :10:47 % ls -l /
total 97
drwxr-xr-x 2 root root 4096 May 3 00:27 bin
drwxr-xr-x 4 root root 1024 May 3 14:17 boot
drwxr-xr-x 2 root root 4096 Apr 29 13:44 cdrom
drwxr-xr-x 18 root root 4420 May 9 09:58 dev
...
lrwxrwxrwx 1 root root 33 May 3 14:16 vmlinuz -> boot/vmlinuz-3.9.0-030900-generic
lrwxrwxrwx 1 root root 29 May 3 11:07 vmlinuz.old -> boot/vmlinuz-3.8.0-19-generic
> {ice} ~ :10:47 % ls -ld /
drwxr-xr-x 25 root root 4096 May 3 14:16 /