반달가면 이글루에서 백업 - http://bahndal.egloos.com/613174
자주 일어나는 일은 아닌데, 간혹 리눅스 bash 스크립트로 작업하면서 디렉토리 안의 파일 목록이 계속 변하는 경우(추가, 삭제) 변경 내용이 반영되지 않아서 이미 삭제된 파일이 존재한다고 간주해서 오동작을 하는 경우가 있었기 때문에 간단한 해결책을 정리해 두기로. 아마도 캐싱(caching)과 연관되어 발생하는 문제가 아닌가 추측하고 있다.
아래와 같은 예시를 생각해 보자.
while [[ 1 ]]
do
...
for file in `find ~/my_data/ -type f`
do
...
done
sleep 5
done
5초 간격으로 ~/my_data 디렉토리 안에 있는 파일에 대해서 뭔가 작업을 하는 경우다. 잘 동작하면 괜찮은데, 혹시라도 작업 과정에서 파일이 삭제되거나 추가되거나 할 경우 혹시 없는 파일을 찾는다거나 하는 문제가 발생하면 어떻게 해결할 것이냐 하는 것이다.
~/my_data 디렉토리에 대해 find 명령을 적용하기 전에 cd 명령으로 다른 디렉토리로 갔다가 다시 대상 디렉토리로 들어가도록 하면 이런 문제가 발생하지 않는 것으로 보인다. 즉 for 반복문 앞에 아래와 같이 해 줄 수 있겠다.
...
cd ~/
cd ~/my_data/
for file in `find ~/my_data/ -type f`
do
...
done
만약 스크립트가 특정 디렉토리 안에서 실행되는 상황을 유지해야 할 경우에는 아래와 같이 대상 디렉토리로 변경했다가 다시 기존 디렉토리로 돌아오도록 하면 될 것이다.
...
working_dir=`pwd`
cd ~/my_data/
cd $working_dir
for file in `find ~/my_data/ -type f`
do
...
done
'bash script' 카테고리의 다른 글
[bash: awk] 특정 필드(field)의 값이 있는 경우, 또는 없는 경우 판별하기 (0) | 2023.09.08 |
---|---|
[bash: grep] 파일 안에 섞인 바이너리(binary) 데이터 제거 (1) | 2023.09.04 |
[bash: nl, awk] 결과 출력에 행번호를 같이 표시하기 (0) | 2023.09.04 |
[bash: sed] 문자열 대체 명령 여러개를 파일에 저장해서 활용하기 (0) | 2023.08.29 |
[bash: ((] 연관 배열(associative array)에 저장된 정수 계산 (0) | 2023.08.29 |