'ls -d'명령이 디렉토리를 표시하지 않습니다. 파일과 디렉토리 대신 디렉토리 만 표시하도록 'ls'를 얻는 방법이 있습니까?


44

ls파일과 디렉토리 대신 디렉토리 만 표시 하는 방법이 있습니까?

매뉴얼 페이지에서 :

   -d, --directory
          list directory entries instead of contents, and do not  derefer
          ence symbolic links

따라서 /디렉토리에 입력하면 디렉토리 만 볼 것으로 예상됩니다. 대신 "."가 표시됩니다.

$ cd /
$ ls -d
.

나는 ls -d이것을 보여줄 것으로 기대 했다.

$ ls -d
bin    data  home        opt    sbin  sys      var
boot   dev   lib         media  proc  selinux  tmp
cdrom  etc   lost+found  mnt    root  srv      usr

ls파일과 디렉토리 대신 디렉토리 만 표시 하는 방법이 있습니까?


17
lsd 매우 혼란 스러울 있습니다.
boehj

2
@jin ls -d * / 작동합니다. 그러나 내가 원하는 결과를 얻기 위해 왜 "* /"해야합니까?
nelaaro

8
@nelaar -d는 디렉토리 만 나열하는 것이 아니라 디렉토리 내용을 나열하지 않는 것을 의미합니다. 입력 ls */하면 모든 디렉토리의 내용이 표시 됩니다 .
Jin

2
나는 한 ldir에 alised ls -d */내에서 .bashrc만드는이 쉽게 ...
DQdlM

1
ls는 많은 정보를 줄 수 있지만 단지 디렉토리를 보여주기위한 하나의 단일 플래그는 아닙니다.
DimiDak

답변:


50

귀하의 기대는 DOS Think / Windows Think를 기반으로하며 잘못되었습니다. MS-DOS, Windows 및 일부 다른 IBM / Microsoft 운영 체제에서 와일드 카드 확장은 명령 자체에서 수행되며 명령 /a옵션 과 같은 기능은 dir와일드 카드 확장 중에 속성 필터로 작동합니다. dir와 같은 와일드 카드를 확장 *하여 명령 인터프리터가있는 그대로 전달하고, /a지정된 경우 적절한 필터를 반환 된 내용에 적용합니다. 일부 운영 체제에서는 디렉토리를 열거하기 위해 시스템 호출에 속성 필터를 제공 할 수 있으며 운영 체제 커널 또는 해당 파일 시스템 드라이버가 해당 필터를 적용합니다.

Unices 및 Linux에서 와일드 카드 확장은 셸에 의해 수행되며 권한이 필요하지 않습니다. 루트 디렉토리에서

ls *

어떤 ls명령 자체가 수신 쉘에서하는 (같은)입니다

LS bin 홈 opt var boot dev tmp 등 lost + found root usr

무엇 -d/의 --directory옵션이하는 것은 일반적으로 다음에 무슨 끕니다 . 일반적으로 다음에 발생하는 것은 ls각 인수를 차례로보고 이들이 디렉토리임을 확인하고 내용을 열거하기로 결정하는 것입니다. 파일 이름을 지정하는 인수의 경우 파일 자체에 대한 정보 만 인쇄합니다. 이 -d옵션을 사용하면 디렉토리는 파일처럼 취급됩니다. 따라서 ls파일 인 경우처럼 인수로 전달 된 각 디렉토리에 대한 정보를 인쇄합니다.

그래서 -d 아니다 는 "디렉토리 만 인쇄"옵션을 선택합니다. 실제로 그러한 옵션이 없을뿐만 아니라; 그러한 옵션 있을 수 없습니다 . 와일드 카드 확장은 쉘에 의해 수행되며, sh최소한 POSIX 에서는 쉘 *이 이름 목록으로 확장 될 때 권한 및 파일 유형 비트를 확인하도록 지시 할 방법이 없습니다 . 혼자 디렉토리의 이름 목록을 얻으려면, 그것은 필요하거나 사용에 find의해 설명 된 바와 같이, 명령 ztank1013, 또는 슬래시로 끝나는 경로 이름은 디렉토리 항목을 의미하는 트릭을 사용 .하여 설명 된대로 Jin. ( Jin'트릭 ls은 인수를받는 명령으로 끝납니다.

ls bin / home / opt / var / boot / dev / tmp / etc / lost + found / root / usr /

패턴이 있기 때문에 */두 가지 구성 요소로 사실과 일치하는 경로 이름에, 두 번째 존재는 비어, 그렇게되지 확실히 원하는 무슨 일을. 특히 디렉토리를 가리키는 기호 링크를 마치 디렉토리 인 것처럼 취급합니다.)

ls -d없는 동작은 *위의 간단한 확장입니다. ls인수 에 대한 정보 가 없을 때는 기본 인수 인을 가정합니다 .. 이제 없이-d 옵션에 의해 명명 된 디렉토리의 내용을 상기 행동 리드가 .열거되고 그 내용에 대한 정보가 표시됩니다. -d 옵션, 디렉토리는 .이 파일했고, 자신의 정보가 그 내용을 열거하기보다는, 표시되는 것처럼 처리됩니다.


3
" 이러한 옵션 있을 수 없습니다 "– 그것은 다소 강력한 진술입니다-그러한 옵션의 구현은 명백합니다 : 디렉토리가 아닌 인수를보고 무시하십시오. 무엇 수 없습니다 구현하는 것과 같습니다 dir /s *.txt[발견을위한로 인용 와일드 카드에 의존하지 않고]
Random832

6
맞습니다. 그러나 ls 인수로 전달 된 항목을 필터링하는 옵션을 가질 없는 논리적 인 이유 는 없습니다 . 이 것은이 없기 때문에 "와일드 카드 확장이 항목 유형 검사에서 이혼"사실은, 관계가 전혀 유일한 항목 유형 검사, 그것을 할 수없는 이유가 없다 - 와일드 카드 확장과는 완전히 LS 내를. ls --color가 파란색으로 음영 처리되고 ls -F가 / 뒤에 넣을 수 있으며 ls -l이 모드에 'd'를 넣을 수 있으면 다른 가상 옵션이 생략 될 수 있습니다. 이러한 옵션이 존재하지 않는다고해서 " cannot " 가 아닙니다 .
Random832

5
Random832는 적절한 지적을합니다. 파일이나 디렉토리를 필터링하는 옵션이 ls 있을 수 있으며, 이는 쉘이 확장을 수행하는 것과 상호 배타적이지 않습니다. ls에는 경쟁 조건이 없습니다. 파일을 정상적으로 통계 할 때 필터링 할 수 있습니다. (쉘 확장과 ls, FWIW 사이에는 이미 경쟁이 있습니다.) 쉘 확장은 이유의 일부일 뿐이라고 생각합니다. 쉘 확장 (및 일반적으로 필터링)은 cp에서 다시 구현해야하기 때문에 ls에서 구현되지 않습니다. , mv 등. 유닉스는 "한 가지 일을 잘 해내십시오". 고급 필터링이 필요한 경우이를위한 도구가 있습니다.
Thanatos

2
ls -p옵션 /은 디렉토리에만 심볼을 추가합니다 . 출력 인쇄 기능을 (이 아닌 ls -p | grep /) 출력 만하는 것으로 확장하지 않을 이유는 없습니다 .
Anne van Rossum

3
@JdeBP, ad-hominem 공격 ( "kiddo") 및 오만 ( "Unix의 기본"을 모르는 사람은 누구나) 기술 토론에 속하지 않습니다. 또한 명령 옵션이 쉘이 수행하는 와일드 카드 확장을 제어 할 수 없다고 주장 할 때 밀짚 꾼을 당하고 있습니다. 물론 할 수 없습니다! Random832, Thanatos 또는 Anne van Rossum도 아니고 질문 자체도 와일드 카드를 언급하지 않았습니다. 그 반대는 결국 그 ls --only-directories .옵션이 추가 될 수 있다는 것이었다 ls.
mkalkov

30

ls -d */또는 ls -d .*/숨겨진 디렉토리에 사용할 수 있습니다 .


/를 사용하여 영리한 트릭
Mono

예, 좋습니다. 이것이 작동하지 않는 경우가 있습니까?
iyrin

5
한 줄에 답변을 제공하기위한 +1 나는 받아 들여진 대답에도 어딘가에 있다고 생각합니다.
미적분 기사

디렉토리에 있지 않고 스크립트에서 어떻게 이것을 사용할 수 있습니까?
DimiDak

13

이 시도

 find . -mindepth 1 -maxdepth 1 -type d

현재 위치 아래에 디렉토리를 가져옵니다.


5

당신은 또한 좋아할 것입니다

tree -d 

트리 구조의 그래픽 묘사와 함께 모든 디렉토리와 하위 디렉토리를 깔끔하게 나열합니다.


3
그리고 한 수준 깊이 만 :tree -dL 1
Anne van Rossum

불행히도 나무와 많이 결합 할 수는 없습니다. # 나무 -d | grep wc -l (표준 입력)
DimiDak

5

ls -l(ELL) 옵션 과 같이 세부적으로 만 디렉토리를 보려면 아래에서 사용할 수 있습니다.

find -maxdepth 1 -type d -ls;

위의 -l옵션 을 사용하면 세부 정보 만 제공합니다 .


1
find -maxdepth 1 -type d -exec ls -d {} +일반적인 ls형식으로 출력하는 데 사용 하는 것이 더 좋습니다 .
mkalkov

4

다른 방법으로 작업을 수행하려면 다음을 시도하십시오.

ls -l | grep ^d

이 상황에서는 단일 도구로 충분합니다. 파이프 라인은 항상 당신을 돕기 위해 있습니다. 나는 당신이 원하는 리눅스의 유연성을 좋아합니다.


1
이것은 디렉토리 이상을 걸러 낼 것입니다.
ocodo

2
@Slomojo, 디렉토리를 제외한 모든 것을 필터링합니다. 무슨 소리 야?
mkalkov

네, 권한이 줄을 향하도록 -l (long)이 필요합니다. 디렉토리의 경우 "d" 또한 디렉토리 항목의 "긴"목록을 얻을 수 있습니다.
geoO

1

이것이 귀하의 필요를 바로 잡기를 바랍니다. 아래 명령은 주어진 경로의 디렉토리 만 나열합니다.

ls -F <path> | grep /

예:

ls -F ~ | grep /
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.