목차
특정 파일들 일괄 내용추가
오늘은 Linux Ubuntu 환경에서 특정 확장자 파일들에 일괄적으로 내용을 추가하는 방법에 대하여 알아보겠습니다. 개발자가 이전에 개발한 파일에 추가할 내용이 생겼다고 생각해봅시다. 하지만 해당 파일들이 여러 폴더 안에 흩어져있고 파일의 개수도 너무 많습니다. 일일이 한 개씩 작업하기엔 100년도 더 걸릴것 같은 스트레스가 발생합니다.
여러 디렉토리에 포함된 특정 파일 이름이나 확장자의 파일에 일괄로 내용을 추가할 수 있다면 정말 편하겠죠? 하지만 이런 기능을 제공하는 바이너리는 없습니다. 하지만 포기하지 않아도 괜찮은 이유는 여러 바이너리들의 기능을 조합하여 이런 행동을 하도록 명령할 수 있습니다.
특정 파일을 찾기 위해서는 어떤 명령어를 쓰면 될까요? 바로 "find" 입니다. 우리가 흔히 쓰는 find 명령어를 잠깐 소개하겠습니다. 만약 현재 경로에 있는 하위 디렉토리, 파일들 중에서 ".txt" 확장자로 끝나는 파일들을 검색하려면 어떻게 할까요? {find /* -name "*.txt"} 명령을 사용하면 알 수 있습니다.
자 앞서 find를 통해 특정 확장자의 파일들을 찾아냈습니다. 이제 다음 명령을 생각해봅시다. "hello world" 라는 단어를 마지막 라인에 추가하고 싶습니다. 평소에 마지막 라인에 글자를 추가하는 명령은 어땠을까요? {echo "hello world" >> test.txt} 와 같은 명령어를 사용했습니다.
자 이제 정답은 다 나왔습니다. 우리는 이 두개의 명령을 연결해줄 스크립트만 작성하면 됩니다. 하지만 리눅스 환경이기때문에 쉘 스크립트(Shell Script)에 작성하도록 하겠습니다.
현재 쉘 스크립트가 실행되고 있는 절대경로
$ pwd -P
우선 현재 경로의 모든 파일을 검색하기 위해서는 현재 절대 경로를 알 필요가 있습니다. 쉘 스크립트를 실행하면 스크립트를 실행한 쉘, 즉 /bin/sh 의 기준으로 현재 경로가 선택됩니다. 쉘 스크립트가 실행되는 순간 현재경로는 "/bin/" 가 된다는 말이지요.
자 그래서 pwd -p 옵션을 사용하여 쉘 스크립트 파일이 있는 곳의 절대 경로는 구합니다.
특정 확장자의 파일 확인
$ find ./* -name "*.txt"
앞서 설명한 내용과 같이 현재 경로 및 하위 디렉토리의 "txt" 확장자의 파일들을 검색하기 위해서는 위와 같은 find 명령을 사용합니다.
쉘 스크립트에서 파일 리스트 변수 만들기
...
files=$(find $path/* -name "*.txt")
...
쉘 스크립트에서 find 명령을 사용하여 나온 결과들을 List 변수로 사용하기 위해서는 위와 같이 작성합니다. 이러헥 작성할 경우 각 파일들의 절대 경로가 files 리스트 변수 아이템으로 추가됩니다.
반복 처리하여 파일 목록 출력
...
for file in $files; do
echo $file
done
...
만약 각 절대 파일 경로명을 출력하고 싶다면 위와 같이 작성합니다. $files에는 find 명령으로 조회한 파일들의 절대경로들이 들어가있습니다. 이 값을 for 반복문을 통해 하나 하나씩 접근하고 echo 명령을 통해 출력합니다.
자 이제 위의 명령어 및 스크립트 코드를 사용하여 "txt" 확장자 파일에만 내용을 추가하는 예제 쉘 스크립트를 작성하도록 하겠습니다. 우선 예제 파일들을 생성합니다.
예제 파일 생성
$ cd /tmp
$ mkdir find_add_example; cd find_add_example
$ echo "test_file" >> a.ini
$ echo "test_file" >> test.txt
$ echo "test_file" >> help.txt
$ echo "test_file" >> abc.ini
특정 파일들에 내용 추가하는 쉘 스크립트 작성 및 실행
$ cd /tmp/find_add_example
$ vim find_add_example.sh
#!/bin/bash
path=`pwd -P`
files=$(find $path/* -name "*.txt")
for file in $files; do
echo "this is test text" >> $file
done
$ bash ./find_add_example.sh
$ cat a.ini
$ cat test.txt
위의 스크립트를 작성하여 실행했을 때 "a.ini" 파일에는 "this is test text" 문장이 추가되지 않았지만 "test.txt" 파일에는 추가되어 있는 것을 확인할 수 있습니다.
이번 포스팅에서는 리눅스 우분투 환경에서 특정 파일들에 내용을 추가하는 방법에 대해 알아보았습니다.