bash script2023. 4. 17. 16:52

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/561986

 

여러개의 파일에 대한 반복 작업을 할 때 for 명령을 유용하게 쓸 수 있는데, 파일명에 공백이 포함되어 있을 경우에는 문제가 생길 수 있다. 아래의 예시와 같은 형태로 사용할 경우 제대로 처리되지 않는다.

# 공백 포함된 파일명에서 문제 발생
for filename in `find ./ -type f`
do
  echo "파일: $filename"
done

문제가 생기는 이유은 for 명령에서 공백을 기준으로 각 항목을 구분하기 때문이다. 예를 들어 파일명이 "my file.txt"라고 하면, 위와 같은 for 명령에서는 "my"와 "file.txt"가 별도의 항목으로 간주된다.

이 문제를 해결하려면 작업이 좀 귀찮아지는데 어쨌든 불가능한 것은 아니다. find 명령으로 찾은 파일 목록을 임시 파일에 저장하고 이것을 sed 명령으로 한줄씩 읽어 와서 작업하면 된다. 이전에 올린 for/sed/seq 명령의 조합에 대한 게시물을 참고하자. 여기로

# 임시 파일
tmp_file="file_list.tmp.txt"
# 파일 목록을 임시 파일에 저장
find ./ -type f > "$tmp_file"
# 파일의 수
num_files=`cat "$tmp_file" | wc -l`
echo "파일 개수: $num_files"
# sed 명령에 사용하기 위한 변수
print="p"
for f_num in `seq 1 $num_files`
do
  # 임시 파일에서 $f_num번째 행을 출력해서 $filename에 할당
  filename=`sed -n $f_num$print "$tmp_file"`
  echo "파일: $filename"
done
# 임시 파일 삭제
rm "$tmp_file"

sed 명령에서 첫번째 행을 출력할 때 1p 이런 식으로 옵션을 주게 되는데, 행번호가 변수인 $f_num이므로 $f_nump 이렇게 쓰면 변수명 자체가 "f_nump"인 것으로 해석되어 오류가 발생한다. 따라서 변수 $print에 "p"를 할당하여 $f_num$print 이런 식으로 사용하였다.

위의 방법보다 더 간단하고 우아한 방법이 있을 지도 모르겠는데, 아무튼 이렇게 해서 해결하는 중이다;

728x90
Posted by 반달가면