Bash에서 ls를 사용하는 디렉토리 만 나열 하시겠습니까?


954

이 명령은 현재 경로의 디렉토리를 나열합니다. ls -d */

패턴 */은 정확히 무엇을 합니까?

그리고 ls -d /home/alice/Documents그 경로에 디렉토리 만 나열하기 위해 위의 명령에서 절대 경로를 어떻게 줄 수 있습니까?


7
이 답변에 편집을 참조하십시오 unix.stackexchange.com/a/75047/32647 무엇을 설명하는 -d사실을 의미한다.
Evgeni Sergeev

답변:


991

*/현재 디렉토리의 모든 서브 디렉토리와 일치하는 패턴입니다 ( *모든 파일 서브 디렉토리 일치 하며 디렉토리로 /제한). 마찬가지로 / home / alice / Documents 아래의 모든 하위 디렉토리를 나열하려면ls -d /home/alice/Documents/*/


88
참고 */숨겨진 폴더를 일치하지 않습니다. 포함 시키려면을 명시 적으로 지정 ls -d .*/ */하거나 Bash 에서 dotglob옵션설정하십시오 .
Gergő

1
@ytpillai 나열 할 서브 디렉토리가 없기 때문에 발생합니다. ls존재하지 않는 무언가를 사용할 때마다 그 오류가 발생 합니다.
Gordon Davisson

1
고마워, 나는 지금 그것을 확인했고 유일한 디렉토리는 루트 폴더라는 것이 밝혀졌습니다.
ytpillai

1
@GordonDavisson bash 옵션을 사용하면 실패 메시지를 피할 수 있습니다shopt -s nullglob

4
@BinaryZebra nullglob를 설정하면 오류 메시지를 피할 수 있지만 더 많은 혼란을 초래할 수 있습니다. nullglob가 설정되고 하위 디렉토리 ls */가 없는 경우 just로 확장되어 ls현재 디렉토리의 모든 파일이 나열됩니다. 나는 그것이 당신이 원하는 경우가 아니라고 확신합니다.
Gordon Davisson

481

이 작업을 수행하는 4 가지 방법 (각각 다른 출력 형식)

1. 사용 echo

예 : echo */, echo */*/
여기 내가 가진 것이 있습니다 :

cs/ draft/ files/ hacks/ masters/ static/  
cs/code/ files/images/ static/images/ static/stylesheets/  

2. ls만 사용

예 : ls -d */
여기 내가 얻은 것이 있습니다.

cs/     files/      masters/  
draft/  hacks/      static/  

또는 목록으로 (상세 정보 포함) : ls -dl */

3. 사용 lsgrep

예 : ls -l | grep "^d" 여기 내가 가진 것이 있습니다 :

drwxr-xr-x  24 h  staff     816 Jun  8 10:55 cs  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 draft  
drwxr-xr-x   9 h  staff     306 Jun  8 10:55 files  
drwxr-xr-x   2 h  staff      68 Jun  9 13:19 hacks  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 masters  
drwxr-xr-x   4 h  staff     136 Jun  8 10:55 static  

4. Bash 스크립트 (공백이 포함 된 파일 이름에는 권장되지 않음)

예 : for i in $(ls -d */); do echo ${i%%/}; done
여기 내가 가진 것이 있습니다 :

cs  
draft  
files  
hacks  
masters  
static

종료 문자로 '/'를 사용하려는 경우 명령은 다음과 같습니다. for i in $(ls -d */); do echo ${i}; done

cs/  
draft/  
files/  
hacks/  
masters/  
static/

2
NB. 3나를 위해 다른 사람들보다 눈에 띄게 느 렸습니다. 내가 테스트 한 디렉토리에서 : 1.012s, 2.016s, 3 .055s , 4.021s.
동 형사상

@isomorphismes, 시간을 어떻게 측정 했습니까? 무슨 뜻입니까? 그건 그렇고, 나는 아니오 1. 내가 가장 좋아하는 말입니다 .
Albert Albert

Albert, 나는 time유닉스 함수를 사용했습니다. /// 나는 echo */보다 영리하다 ls -d */.
동 형사상

9
주의해야 할 두 가지 사소한 사항. ls -l | grep "^ d"는 디렉토리에 대한 심볼릭 링크를 필터링하지만 'ls -d * /'는 디렉토리를 표시합니다. 또한 대상 디렉토리에 디렉토리가 없으면 'ls -d * /'가 실패합니다.
Zoran Pavlovic

15
1.옵션은 공백이있는 폴더 이름을 처리 할 때 큰 문제를 일으 킵니다.
Shrikant Sharat

99

나는 사용한다:

ls -d */ | cut -f1 -d'/'

이렇게하면 슬래시가없는 단일 열이 만들어져 스크립트에 유용합니다.

내 두 센트


18
에 대한 -1옵션 ls은 단일 열 형식으로도 출력됩니다 ls -1 -d */.
Kalin

3
@ user29020 -1여전히 모든 항목에 대해 슬래시를 출력합니다.
Dennis

이것을 .bashrc별칭으로 추가 할 때 어떻게 추가 '/'합니까?
RNA

@RNA는 대답하기 늦었지만 미래의 사람들을 위해 : 백 슬래시로 탈출 해보십시오. '\/'
Caek

1
슬래시가 있으면 중단됩니다. 이것은 후행 슬래시 만 제거합니다.| sed -e 's-/$--'
Victor Sergienko

62

하위 폴더가 없는 모든 폴더의 경우 :

find /home/alice/Documents -maxdepth 1 -type d

하위 폴더가 있는 모든 폴더의 경우 :

find /home/alice/Documents -type d

2
질문과 일치 (그러나 dotfiles 포함)을하려면 첫 번째는해야한다 : find /home/alice/Documents -maxdepth 1 -mindepth 1 -type d그렇지 않으면 당신은 포함 /home/alice/Documents자체를. 디렉토리에 대한 심볼릭 링크를 포함하려면-L
jhnc

find는이 작업을 위해 실제로 만들어지는 도구이기 때문에 가장 안전한 솔루션처럼 보입니다. grep -v '^ \ ./$'에 파이핑하여 현재 디렉토리에 대한 첫 번째 결과 인 ./를 제외 할 수 있습니다.
siliconrockstar

38

4 개 이상의 옵션.

인용 부호로 둘러싸이지 않은 별표 *쉘 패턴 (글로브)로 해석됩니다.
쉘은 경로명 확장에서이를 사용합니다.
그런 다음 패턴과 일치하는 파일 이름 목록을 생성합니다.
간단한 별표는 PWD (현재 작업 디렉토리)의 모든 파일 이름과 일치합니다.
*/끝나는 모든 파일 이름과 일치 하는보다 복잡한 패턴 입니다 /.
따라서 모든 디렉토리. 그 이유는 다음과 같습니다.

1. 에코.

echo */
echo ./*/              ### avoid misinterpreting filenames like "-e dir"

echo에서 PWD의 모든 디렉토리 로 확장됩니다 .


이를 테스트하려면 : mkdirtest-dir과 같은 이름 의 디렉토리 ( )를 작성 cd하십시오.

mkdir test-dir; cd test-dir

일부 디렉토리를 작성하십시오.

mkdir {cs,files,masters,draft,static}   # safe directories.
mkdir {*,-,--,-v\ var,-h,-n,dir\ with\ spaces}  # some a bit less secure.
touch -- 'file with spaces' '-a' '-l' 'filename'    # and some files:

echo ./*/이상한 이름의 파일이 있어도이 명령 은 신뢰할 수 있습니다.

./--/ ./-/ ./*/ ./cs/ ./dir with spaces/ ./draft/ ./files/ ./-h/
./masters/ ./-n/ ./static/ ./-v var/

그러나 파일 이름의 공백은 약간 혼란스럽게 만듭니다.


대신을 echo사용 ls하면 쉘은 여전히 ​​파일 이름 목록을 확장합니다. 쉘은 PWD에서 디렉토리 목록을 얻는 이유입니다. -d에 옵션 ls차종은 대신 (기본적으로 제시된) 각 디렉토리의 내용을 본 디렉토리 항목을 나열합니다.

ls -d */

그러나이 명령은 신뢰성이 떨어집니다. 위에 나열된 이상한 이름의 파일로 실패합니다. 여러 이름으로 질식합니다. 문제가있는 것을 찾을 때까지 하나씩 지워야합니다.

2.- ls

GNU ls는 "옵션 끝"( --) 키를 사용합니다.

ls -d ./*/                     ### more reliable BSD ls
ls -d -- */                    ### more reliable GNU ls

3.-printf

ls -1과 비슷한 한 열에 각 디렉토리를 고유 한 행으로 나열하려면 다음을 사용하십시오.

$ printf "%s\n" */        ### Correct even with "-", spaces or newlines.

그리고 더 나은 방법으로 후행을 제거 할 수 있습니다 /.

$ set -- */; printf "%s\n" "${@%/}"        ### Correct with spaces and newlines.

이런 시도 :

$ for i in $(ls -d */); do echo ${i%%/}; done

실패합니다 :

  • ls -d */위에 표시된대로 일부 이름 ( )
  • 의 값에 영향을받습니다 IFS.
  • 공백과 탭에서 이름을 분할합니다 (기본값 IFS).
  • 이름의 각 줄 바꿈은 새로운 에코 명령을 시작합니다.

기능

마지막으로 함수 내에서 인수 목록을 사용해도 현재 실행중인 쉘의 인수 목록에 영향을 미치지 않습니다. 간단히:

$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; }
$ listdirs

이 목록을 제시합니다 :

--
-
*
cs
dir with spaces
draft
files
-h
masters
-n
static
-v var

이 옵션은 여러 유형의 홀수 파일 이름으로 안전합니다.


안전이라는 단어를 신뢰할 수있는 단어로 바꿔야한다고 생각합니다. 귀하의 게시물을 통해 다른 솔루션은 안전하지 않다고 생각합니다 (취약성 또는 악용 가능).
Amado Martinez

1
@AmadoMartinez 일반 s / safe / reliable /을 완료하십시오. 보다 나은?

21

tree명령은 여기서도 매우 유용합니다. 기본적으로 모든 파일과 디렉토리를 완전한 깊이로 표시하고 일부 ASCII 문자는 디렉토리 트리를 표시합니다.

$ tree
.
├── config.dat
├── data
   ├── data1.bin
   ├── data2.inf
   └── sql
|      └── data3.sql
├── images
   ├── background.jpg
   ├── icon.gif
   └── logo.jpg
├── program.exe
└── readme.txt

그러나 아스키 트리가없고 현재 디렉토리의 전체 경로를 가진 디렉토리 만 얻으려면 다음을 수행하십시오.

$ tree -dfi
.
./data
./data/sql
./images

인수는 다음과 같습니다.

-d     List directories only.
-f     Prints the full path prefix for each file.
-i     Makes tree not print the indentation lines, useful when used in conjunction with the -f option.

그리고 절대 경로를 원하면 현재 디렉토리의 전체 경로를 지정하여 시작할 수 있습니다.

$ tree -dfi "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/data/sql
/home/alice/Documents/images

하위 디렉토리의 수를 제한하기 위해 다음과 같이 하위 디렉토리의 최대 레벨을 설정할 수 있습니다 -L level.

$ tree -dfi -L 1 "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/images

더 많은 논쟁은 man tree에서 볼 수 있습니다


15

'ls -d * /'의 출력이 왜 다음과 같이 두 개의 슬래시를 제공하는지 궁금해하는 경우 :

[prompt]$ ls -d */    
app//  cgi-bin//  lib//        pub//

쉘 또는 세션 구성 파일이 ls 명령을 -F 플래그를 포함하는 ls 버전으로 별칭 지정하기 때문일 수 있습니다. 이 플래그는 각 출력 이름에 일반 파일이 아닌 문자를 추가하여 그 종류를 나타냅니다. 따라서 하나의 슬래시는 패턴 '* /'과 일치하는 것이고, 다른 슬래시는 추가 된 유형 표시기입니다.

이 문제를 없애기 위해 ls에 대해 다른 별칭을 정의 할 수 있습니다. 그러나 별칭을 일시적으로 호출하지 않으려면 명령 앞에 백 슬래시를 추가하면됩니다.

\ ls -d * /


11

.bashrc파일 을 내 파일에 추가하기 만하면 됩니다 (한 세션 동안 필요 / 원하는 경우 명령 줄에 입력해도됩니다).

alias lsd='ls -ld */'

그런 다음 lsd는 원하는 결과를 생성합니다.


그냥 사용할 수 없습니까? LS -l 경로 | grep dr
jrobertsz66

5
"다음 lsd는 원하는 결과를 낳을 것입니다." 나는 웃음
fbafelipe

1
내 경험상 결과가 나옵니다.
Todd

'lad'(모든 디렉토리 나열)를 사용하고 숨겨진 디렉토리도 포함하기 위해 '. * /'도 포함했습니다. 물론, 그 수고도 나에게 손실되지 않습니다.
DryLabRebel

11

ls디렉토리에 대한 심볼릭 링크를 포함한 실제 솔루션

여기에있는 많은 답변은 실제로 사용하지 않습니다 ls(또는 ls -d실제 하위 디렉토리 일치에 와일드 카드를 사용하는 동안 사소한 의미로만 사용하십시오 . 정렬 순서 등 lsls옵션을 사용할 수 있기 때문에 진정한 솔루션이 유용합니다 .

심볼릭 링크 제외

하나의 솔루션을 사용 ls했지만 디렉토리에 대한 심볼릭 링크제외 한다는 점에서 다른 솔루션과 다른 점이 있습니다 .

ls -l | grep '^d'

( 파일 이름을 통해 파이핑 sed하거나 awk파일 이름을 분리 할 수 ​​있음)

심볼릭 링크 포함

디렉토리에 대한 심볼릭 링크가 포함되어야하는 (아마도 더 일반적인) 경우에는 -p옵션을 사용하여 ls디렉토리 이름에 슬래시 문자를 추가 할 수 있습니다 (심볼 링크 포함)

ls -1p | grep '/$'

또는 후행 슬래시를 제거하십시오.

ls -1p | grep '/$' | sed 's/\/$//'

ls필요에 따라 옵션을 추가 할 수 있습니다 (긴 리스팅을 사용하는 -1경우 더 이상 필요하지 않음).

참고 : 우리가 경우 원하는 슬래시를 후행하지만, 어떻게 그들에 의해 강조하지 grep, 우리가 hackishly 비우 라인의 실제 일치하는 부분을하여 강조 표시를 제거 할 수 있습니다 :

ls -1p | grep -P '(?=/$)'

9

숨겨진 디렉토리를 나열 할 필요가 없으면 다음을 제공합니다.

ls -l | grep "^d" | awk -F" " '{print $9}'  

숨겨진 디렉토리를 나열 해야하는 경우 다음을 사용하십시오.

ls -Al | grep "^d" | awk -F" " '{print $9}'

또는

find -maxdepth 1 -type d | awk -F"./" '{print $2}'

에 대해 더 자세히 알고 싶다면 awk답변을보십시오.
PHP Learner

다른 답변과 비교하여 "ls .. | grep ... | awk"의 첫 번째 옵션은 과도한 스크립팅으로 보입니다.
Lars Nordin

1
이름 안에 공백이없는 디렉토리가 있다고 가정합니다.
Benjamin R

7

폴더 목록을 표시하지 않고 /

ls -d */|sed 's|[/]||g'

2
또는ls -d1 */ | tr -d "/"
ccpizza

외부 명령을 호출 할 필요가 없습니다.set -- */; printf "%s\n" "${@%/}"

나는 @ wholanda의 해결책을 좋아합니다. | 나오지도 '/ || g의 |'LS -d * / : 내 A는 짧은 솔루션 (테스트 및 작품)되어 비트
klor

또한 lsdir 별명을 갖는 것이 유용합니다. alias lsdirs = "ls -d * / | sed 's | / || g'"
klor

6

여기 내가 사용하는 것이 있습니다

ls -d1 /Directory/Path/*;


이것은 실제로 한 줄씩 표시하는 아주 좋은 솔루션입니다.
Nikolay Frick

디렉토리 만 나열하지는 않습니다. : 당신은 후행 슬래시 추가해야합니다ls -d1 /Directory/Path/*/
스키 피 르 그랜드 Gourou

6

디렉토리 만 나열하려면 다음을 수행하십시오 .

ls -l | grep ^d

파일 만 나열하는 경우 :

ls -l | grep -v ^d 

또는 다음과 같이 할 수도 있습니다 : ls -ld * /


4

항목이 다음과 같은 디렉토리인지 테스트하십시오 test -d.

for i in $(ls); do test -d $i && echo $i ; done

1
이 코드의 기능과 질문과의 관계를 설명하십시오.
Ken YN

1
명령 'ls'를 실행 한 다음 각각이 디렉토리 인 경우 출력 테스트를 반복하고 디렉토리 인 경우 에코합니다. 작동하지만 더 좋은 방법이 있습니다
ShoeLace

3

*/ 현재 디렉토리의 디렉토리와 일치하는 파일 이름 일치 패턴입니다.

디렉토리 만 나열하려면이 기능이 마음에 듭니다.

# long list only directories
llod () { 
  ls -l --color=always "$@" | grep --color=never '^d'
}

.bashrc에 넣으십시오.

사용 예 :

llod       # long listing of all directories in current directory
llod -tr   # same but in chronological order oldest first
llod -d a* # limit to directories beginning with letter 'a'
llod -d .* # limit to hidden directories

참고 : -i옵션 을 사용하면 깨집니다 . 그에 대한 수정 사항은 다음과 같습니다.

# long list only directories
llod () { 
  ls -l --color=always "$@" | egrep --color=never '^d|^[[:digit:]]+ d'
}

3

참고로, 모든 파일을 여러 줄로 ls -1인쇄하려면 각 파일을 별도의 줄로 인쇄하는 작업을 수행 할 수 있습니다 . file1 file2 file3


3

현재 디렉토리의 일반 목록은 다음과 같습니다.

ls -1d ./*/

정렬하고 깨끗하게 하시겠습니까?

ls -1d ./*/ | cut -c 3- | rev | cut -c 2- | rev | sort

기억하세요 : 대문자 문자는 정렬에서 다른 동작을합니다


3

이거 한번 해봐. 모든 리눅스 배포판에서 작동합니다.

ls -ltr | grep drw

4
ls -l | grep '^d' | awk '{print $9}'
dw1

2

"여기"에서만 디렉토리를 나열하는 하나의 라이너.

파일 수와 함께.

for i in `ls -d */`; do g=`find ./$i -type f -print| wc -l`; echo "Directory $i contains $g files."; done

2

나는 부분적으로 해결했다.

cd "/path/to/pricipal/folder"

for i in $(ls -d .*/); do sudo ln -s "$PWD"/${i%%/} /home/inukaze/${i%%/}; done

ln: «/home/inukaze/./.»: can't overwrite a directory
ln: «/home/inukaze/../..»: can't overwrite a directory
ln: accesing to «/home/inukaze/.config»: too much symbolics links levels
ln: accesing to «/home/inukaze/.disruptive»: too much symbolics links levels
ln: accesing to «/home/inukaze/innovations»: too much symbolics links levels
ln: accesing to «/home/inukaze/sarl»: too much symbolics links levels
ln: accesing to «/home/inukaze/.e_old»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gnome2_private»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gvfs»: too much symbolics links levels
ln: accesing to «/home/inukaze/.kde»: too much symbolics links levels
ln: accesing to «/home/inukaze/.local»: too much symbolics links levels
ln: accesing to «/home/inukaze/.xVideoServiceThief»: too much symbolics links levels

글쎄, 이것은 시장 부분으로 나에게 줄어든다 :)


2

전체 폴더를 만들기 위해 모든 폴더의 경로를 검색하려면 Albert의 답변과 Gordans의 조합을 사용하여 매우 유용합니다.

for i in $(ls -d /pathto/parent/folder/*/); do echo ${i%%/}; done

산출:

/pathto/parent/folder/childfolder1/
/pathto/parent/folder/childfolder2/
/pathto/parent/folder/childfolder3/
/pathto/parent/folder/childfolder4/
/pathto/parent/folder/childfolder5/
/pathto/parent/folder/childfolder6/
/pathto/parent/folder/childfolder7/
/pathto/parent/folder/childfolder8/


1

다음은 디렉토리 이름 만 나열하는 데 사용하는 것입니다.

ls -1d /some/folder/*/ | awk -F "/" "{print \$(NF-1)}"

1

원래의 질문에 대답하는 */것은 ls그 자체 와 아무 관련이 없습니다 . 그것은 globbing으로 알려진 프로세스에서 쉘 / 배쉬에 의해 수행됩니다 .

이 이유 echo */ls -d */출력 요소와 동일한 요소. ( -d플래그는 ls디렉토리의 내용이 아닌 디렉토리 이름 을 출력합니다.)


1

여기에 별도의 줄에서만 디렉토리 이름을 출력하는 트리를 사용하는 변형이 있습니다. 그렇지만 추악하지만 작동합니다.

tree -d | grep -E '^[├|└]' | cut -d ' ' -f2

또는 awk와 함께

tree -d | grep -E '^[├|└]' | awk '{print $2}'

그러나 이것은 아마도 더 좋을 것이고 /after 디렉토리 이름을 유지할 것 입니다.

ls -l | grep "^d" | awk '{print $9}'

한국인 같아요!
Paschalis

0
file *|grep directory

O / P (내 컴퓨터에서)-

[root@rhel6 ~]# file *|grep directory
mongo-example-master:    directory
nostarch:                directory
scriptzz:                directory
splunk:                  directory
testdir:                 directory

cut을 사용하여 위의 출력을 더 세분화 할 수 있습니다.

file *|grep directory|cut -d':' -f1
mongo-example-master
nostarch
scriptzz
splunk
testdir

* could be replaced with any path that's permitted
 file - determine file type
 grep - searches for string named directory
 -d - to specify a field delimiter
 -f1 - denotes field 1

0

디렉토리 만 나열하는 가장 짧은 명령 (실제로 핵). 원하는 디렉토리의 절대 경로 또는 상대 경로를 입력하고 Enter를 눌러 원하는 디렉토리를 입력하십시오. 이제 키를 입력 cd하고 누르 십시오 . 디렉토리 만 표시됩니다.

user@ubuntu:~/Desktop$cd <tab key>

위 명령은 이제 Desktop의 폴더 만 표시해야합니다 . 실제로 가장 짧습니다.


이것은 자동 완성이 활성화되어 있고 모든 경우에 작동하지 않을 수 있다고 가정합니다. 또한 출력을 무언가로 파이프하는 것과 같이이 작업을 수행하려는 경우 작동하지 않습니다. 그러나 출력을 보려면 빠르고 쉽게 작동해야합니다.
lacostenycoder

완전한! "."을 제거했습니다. 그리고 그것은 효과가
있었습니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.