2021. 7. 15. 12:34ㆍIT/S . e . v . e . r . I . n . f . r . a
find 커맨드로 검색한 디렉토리명을 루핑을 돌아 배열에 넣어보자
쉘 스크립트를 작성할 때 가끔 find로 찾은 결과를 배열에 넣어서 처리해야 할 경우가 있죠.
이때 많은 사람들은 find에서 찾을 결과를 loop를 돌려 배열에 집어넣는 방법을 사용합니다.
array=()
while IFS= read -r -d $'\0';
do
array+=("$REPLY");
done < <(find . -type d -maxdepth 1 -print0)
먼저 하나하나 내용을 짚어보자면
첫번째 줄에서 빈 배열을 만들어줍니다 : array=()
while문이 루핑을 돌면서 read 문이 실행될 때마다 표준 입력에서 널로 구분 된 파일 이름을 읽어옵니다.
-r 옵션은 ""를 문자 그대로 읽어 들입니다.
-d $'\0'는 read에 입력시 Delimiter(구분자)를 널($'\0')을 기준으로 분리됨을 알려줍니다.
이름을 read에서 생략했기 때문에 쉘은 read에서 읽어온 입력을 기본 이름 REPLY에 넣습니다.
array+=("$REPLY") 문은 새 파일 이름을 array 배열에 순차적으로 추가해줍니다.
마지막 줄은 리디렉션과 명령 대체(Process Substitution)를 결합하여
find의 출력을 while 루프의 표준 입력에 제공합니다.
명령 대체(Process Substitution)에 대해서는 다른 글에서 다루도록 하겠습니다.
자 이렇게 해도 결과는 나오지만 루핑을 돌면서 값을 입력하기 때문에
대량의 데이터를 처리할 때는 시간이 많이 소요됩니다.
또한 스크립트도 길어지죠.
더 나은 방법
그래서 최신 bash에서는 다른 방법을 제안하고 있습니다.
먼저 이 스크립트는 bash 4.4 이후 버전부터 지원을 하고 있습니다.
다시 말해서 4.3 이전 bash를 사용하고 계신분들은 위에 스크립트를 이용하셔야 합니다.
Bash 4.4 이후버전의 내부 명령어중에는 readarray(또는 mapfile)이 있는데
이 명령어는 Standard Input/File 으로부터 입력받은 문자열을 개행문자(\n)로 구분하여
배열에 저장해주는 역할을 한다.
이 때 배열에 넣을 문자열을 개행문자로 구분을 하다보니,
역슬래시()나 스페이스로 인해 가끔 잡아내기 어려운 에러가 날 때가 있다.
그래서 구분자를 다른 것을 기준으로 배열에 넣어줄 필요가 있는데
먼저 find 커맨드의 옵션인 -print0를 추가해주면 각 라인의 마지막에 널(Null)문자를 넣어주어야 한다.
커맨드를 그대로 실행을 해보면 줄구분이 없이 한 줄로 다 붙어 출력이 된다.
우리눈에는 보이지 않지만 각 구분자로 널(Null)문자가 들어가 있는 상태이다.
위에서 넣어준 널(Null)을 기준으로 배열에 넣어주기 위해
readarray(또는 mapfile)의 옵션인 -d, 즉 Delimiter(구분자)를
''로(또는 $'\0') 지정해 주면 find로 가져온 결과를 나누어 배열에 잘 넣어줍니다.
readarray -d '' array < <(find . -type d -maxdepth 1 -print0)
readarray -d $'\0' array < <(find . -type d -maxdepth 1 -print0)
mapfile -d $'\0' array < <(find . -type d -maxdepth 1 -print0)
mapfile -d '' array < <(find . -type d -maxdepth 1 -print0)
위에 커맨드로 배열을 만들었으면 이제 배열에 넣은 변수들을 출력해보도록 합시다.
for i in "${array[@]}"; do echo $i; done
자, 원하는 대로 잘 표시가 되나요?
이 스크립트는 디렉토리명이 스페이스로 분리되어 있어도 백스페이스가 있어도
전혀 문제 없이 실제 디렉토리명을 배열에 넣을 수가 있습니다.
'IT > S . e . v . e . r . I . n . f . r . a' 카테고리의 다른 글
Apache2.4에서 "client denied by server configuration"이라는 오류 발생시 (0) | 2022.07.07 |
---|---|
쉘 스크립트에서 계산하기 [expr] (0) | 2022.05.30 |
XtraBackup(MariaBackup)에서 Stream 백업시 로깅하기 (0) | 2021.07.16 |
삼바 서버 설정하기 (0) | 2021.03.08 |
gzip을 멀티코어를 사용해 압축해보자 (0) | 2021.03.01 |
쉘 스크립트 변수 뒤에서부터 자르기 (0) | 2021.03.01 |