path를 다루는 shell 2: globbing

markyang92·2021년 6월 17일
0

shell-script

목록 보기
12/19
  • glob 문자는 *, ?, [ ] 이 있는데, 이는 shell에서 쓰는 pattern matching과 동일 동작
    • globbing은 꼭 파일이름을 다룰 때만 적용되는 것은 아니며 어떤 스트링이나 변수 값에라도 glob 문자가 있으면 주의
    • 파일 이름 앞에 .가 붙으면 숨은 파일. 기본적으로 매칭되지 않는다.
      • dotglob 옵션, 직접 . 붙여 검색

주의사항 1. Quote를 사용 하면 단어 분리, globbing 둘 다 일어나지 않는다.

$ ls
address.c      address.h     readObject.c      readObject.h     WriteObject.class
Address.class  Address.java  ReadObject.class  ReadObject.java  WriteObject.java

  • Quote를 사용하지 않아야 패턴 매칭
$ echo *.?
address.c address.h readObject.c readObject.h

  • 간단한 for 문을 넣은 glob
for file in *.[ch]; do
   echo $file
done

address.c
address.h
readObject.c
readObject.h

globstar

  • bash 쉘 전용 옵션
  • recursive matching
# globstar 옵션은 기본적으로 off 상태
# on 하자

shopt -s globstar

현재 이하, 모든 '디렉토리' + '파일'

  • **

현재 디렉토리 이하에 '모든 디렉토리'

  • **/ (/끝나면 끝나야만!!!! 디렉토리만 선택)

  • 예제
    • 현재 위치: /home/dhyang/workspace/scripts/rsync/
#!/usr/bin/bash

shopt -s globstar

pushd `dirname $0` > /dev/null
WORKING_DIR=`dirsl -l +0`
popd > /dev/null

WORKING_DIR=`dirname $WORKDING_DIR`

for dir in $WORKING_DIR/**/; do # WORKING_DIR/ 내부의 모든 -r recursive 이되, '/' 이 마지막에 붙어 디렉토리만 검색
    echo $dir
done

'지정 디렉토리' 이하, 이름 'log'인 '디렉토리'

  1. 지정 디렉토리: ~/tmp
  2. 찾을 내용: 이하 모든 서브 디렉토리 中 이름에 log가 들어간 디렉토리

현재 디렉토리 이하, 이름 '.java'인 '파일'

  1. 지정 디렉토리: $PWD
  2. 찾을 내용: 이하 모든 파일 中 이름에 .java파일

'지정 디렉토리' 이하, 이름 '.png, .jpg, .gif'인 '파일'

  1. 지정 디렉토리: ~/tmp
  2. 찾을 내용: 이하 모든 파일 中 이름에 .png, .jpg, .gif파일
for file in ~/tmp/**/*.{png,jpg,gif}; do
    echo $file
done

find와 결합

for file in $( find * -type f )
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글