반달가면 이글루에서 백업 - http://bahndal.egloos.com/591449
예전에 for 반복문을 이용해서 여러 파일에 대한 반복작업을 하는 방식에 대해 쓴 적이 있다(여기로). 파일명에 공백이 포함된 상황을 해결하기 위해 임시 파일을 만들고 sed까지 동원해서 스크립트를 만들었는데, 그보다 훨씬 간편하고 우아한 방법이 있어서 정리해 두기로.
예전에 적었던 while 반복문을 이용한 텍스트 파일 한줄씩 읽기와 같은 방식으로 하면 된다. 파일을 읽는 것이 아니라 ls 또는 find 명령으로 얻은 파일명에 대해 작업을 해야 하므로 파이프(|)를 이용해서 ls나 find의 결과를 while 반복문으로 넘기고, 조건에 read 명령을 적용해서 한줄씩 받아온다. 설명으로는 복잡해 보이나, 예시를 보면 간단하다.
아래의 예시를 보자. find 명령으로 홈 디렉토리(~/) 하위에 있는 파일들을 찾은 후 파일명을 출력하는 것이다.
# ~/ 디렉토리에 있는 파일명을 찾아서 출력
find ~/ -type f | while read filename
do
echo "파일명: $filename"
done
find 명령에서 넘겨 받은 파일을 read 명령을 통해 변수 filename에 저장하고 echo 명령으로 출력했다. read 명령은 한줄씩 읽어 오므로 파일명에 공백이 포함되어 있어도 문제가 없다.
참고로 for 반복문을 사용할 경우에는 줄바꿈, 공백, 탭 등을 기준으로 분할하게 되므로 공백이 있는 파일명에는 부적합하다.
# ~/ 디렉토리에 있는 파일명을 찾아서 출력. 파일명에 공백이 있지 않아야만 정상 동작함에 유의!
for filename in `find ~/ -type f`
do
echo "파일명: $filename"
done
파일명에 공백이 포함되지 않았다는 확신이 없다면, 앞의 while 반복문을 이용해서 작업하는 것이 훨씬 안전하다.
'bash script' 카테고리의 다른 글
[bash: awk] 출력할 내용을 조건에 따라 여러 파일로 나누어 저장하기 (0) | 2023.07.22 |
---|---|
[bash:uniq, sort] 한글 문자열에 대한 중복 제거 문제 (0) | 2023.07.22 |
[bash: awk] awk에서 외부 명령을 실행하고 결과를 변수에 저장하기 (0) | 2023.07.20 |
[bash: awk] 특정 위치(field)의 문자열에서 특정 길이 만큼 문자열 추출 (substr) (0) | 2023.07.20 |
[bash: while, read, <] 텍스트 파일을 한줄씩 읽어서 작업하기 (0) | 2023.07.20 |