Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

shell script 등을 작성할 때 특정 폴더내의 sub directory 를 순회하면서 특정 작업을 수행해야 하는 경우가 많이 있다있습니다.

ls 의 option 에는 directory 목록만 얻어오는 방법이 없으므로 ls 와 다른 command 를 사용해서 directory 목록을 얻어오는 방법을 정리해 본다봅니다

 


대상 폴더는 /target 이고 하위 directory 는 cs, draft, files, static 4개가 있다고 가정한다가정합니다.

방법

1.Using echo

Code Block
languagebash
$ echo target/*
target/cs target/draft target/files target/static

2.Using ls -d */

ls 의 directory 만 추출하는 옵션인 -d 를 사용합니다.

Code Block
languagebash
$ ls -d target/*
target/cs  target/draft  target/files  target/static
Warning

ls 의 출력 결과를 pipe 로 다른 프로그램과 연결할 경우 파일명 컬러 출력을 위한 ANSI Code 가 붙어서 제대로 처리가 불가능합니다. 이럴 경우 다음과 같이 --color=never 옵션을 붙여주면 됩니다.

Code Block
ls --color=never -d target/*


3.Using ls and grep

Code Block
languagebash
$ ls -l target | grep "^d"
Code Block
drwxr-xr-x. 2 lesstif rnd 4096 2013-11-18 13:43 cs
drwxr-xr-x. 2 lesstif rnd 4096 2013-11-18 13:43 draft
drwxr-xr-x. 2 lesstif rnd 4096 2013-11-18 13:43 files
drwxr-xr-x. 2 lesstif rnd 4096 2013-11-18 13:43 static

(warning) -l 옵션을 주고 상세 출력을 해야 directory 여부를 확인할 수 있는데 상세출력일 경우 shell script 에서 가져와서 처리하기가 불편한 문제가 있음.이제 awk 를 사용해서 9번째 필드를 출력하면 디렉터리이므로 이 결과를 다른 유틸리티에서 사용하면 됩니다.

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

4.Bash Script  사용

bash 에만 있는 기능을 이용하여 사용디렉터리만 추출할 수 있습니다.

Warning

경로명 맨 뒤에 / 로 끝나야 정상동작함정상동작합니다.!

Code Block
languagebash
$   for i in $(ls -d target/*/); do echo ${i%%/}; done 
target/cs
target/draft
target/files
target/static

 


shell script 에서 사용할 경우 3번을 제외하고는 취향에 따라 아무거나 골라써도 무난무난합니다.

Code Block
languagebash
titleshell script 예제
#!/bin/sh
 
DIRS=`ls -d target/*/`
 
for i in ${DIRS};do
      echo "Entering directory=$i";
      cd $i;
      cd ..;
done

 


Ref