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. 사용 ls및grep

예 : 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실제 하위 디렉토리 일치에 와일드 카드를 사용하는 동안 사소한 의미로만 사용하십시오 . 정렬 순서 등 ls의 ls옵션을 사용할 수 있기 때문에 진정한 솔루션이 유용합니다 .

심볼릭 링크 제외

하나의 솔루션을 사용 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.