IDL/Programming

FILE_SEARCH 함수에 관하여

이상우_IDL 2021. 7. 14. 14:33
728x90

IDL에서 지원되는 기능들 중에서는 파일들에 대한 접근(File Access)을 위한 기능들이 있습니다. 주로 이름이 'FILE_'로 시작하는 함수들이 바로 이러한 범주에 속하는데, 오늘 소개할 FILE_SEARCH 함수도 그 중 하나입니다. 이름 그대로 '파일들을 찾아주는' 역할을 하는데, 좀 더 풀어서 얘기한다면 특정한 디렉토리 내에 존재하는 파일들을 탐색하여 그 목록을 찾아주는 역할을 합니다. 그리고 파일들을 찾는데 있어서 특정한 기준을 제시하면 그 기준에 맞춰서 찾아줍니다. 그리고 파일들의 목록을 찾아준다는 것은 그 목록에 속하는 파일들의 이름에 해당되는 문자값들로 구성된 배열을 되돌려준다는 의미로 해석하면 됩니다.

 

그러면 지금부터 이 FILE_SEARCH 함수의 사용법을 예제와 함께 소개해보기로 하겠습니다. 이를 위해서 제 PC 내에서 'test_dir'이라는 이름의 디렉토리를 하나 만들고 그 안에 다수의 파일들을 넣어보았는데요. 일단 파일 브라우저를 통해서 이 디렉토리 내의 파일들 목록을 본 모습은 다음과 같습니다.

 

 

이와 같이 'test_dir'이라는 디렉토리 내에는 총 14개의 파일들이 존재합니다. 그리고 IDL에서 이 파일들의 목록을 가져오기 위하여 FILE_SEARCH 함수를 다음과 같이 이용해보았습니다.

 

files = FILE_SEARCH('test_dir/*', COUNT=n)
HELP, files
PRINT, n

 

여기서는 먼저 FILE_SEARCH 함수를 사용하는 방법부터 주목해야 합니다. 이 함수가 사용된 내용을 보면 'test_dir/*'이라는 문자값을 인수로 투입하였는데요. 먼저 'test_dir/'은 파일들을 찾을 디렉토리 경로에 해당됩니다. 디렉토리 경로라는 것은 원래는 절대적 경로와 상대적 경로로 나눠서 생각할 수 있습니다. 여기서는 상대적 경로로 표시한 것입니다. 즉 "현재 디렉토리" 내에 있는 test_dir이라는 하위 디렉토리를 뜻합니다. 현재 디렉토리는 IDL 워크벤치 상에서 사용자가 직접 설정하면 됩니다. 참고로 현재 디렉토리가 어떻게 설정되어 있는가를 확인하려면 다음과 같이 IDL의 커맨드 입력창에서 CD 명령을 /CURRENT 키워드와 함께 사용하면 됩니다.

 

IDL> CD, CURRENT=cdir
IDL> PRINT, cdir

 

절대적 경로는 디렉토리 경로의 뿌리부터 시작해서 모든 경로를 다 표시해주는 경우인데, 예를 들면 윈도우즈 PC에서 드라이브명부터 시작하여 'C:\mywork\idl'과 같은 방식으로 디렉토리 경로를 전체적으로 모두 표시하는 경우가 이러한 방식에 해당됩니다. 어쨌든 상대적 경로 또는 절대적 경로의 형태로 디렉토리 경로를 표시해줘야 합니다. 그리고 'test_dir/*'에서는 * 기호가 사용되었는데, 이 기호는 와일드카드(wild card)라고 하며 여기서는 "모든 파일들"을 뜻합니다. 그래서 만약 FILE_SEARCH('test_dir/*')와 같이 명시하게 되면 현재 디렉토리 내에 있는 test_dir이라는 하위 디렉토리 내에 존재하는 모든 파일들에 대한 목록을 찾으라는 의미가 됩니다. 또한 위의 내용에서는 COUNT 키워드도 함께 사용하였는데, 이 키워드에 부여된 n이라는 변수를 통하여 목록에 속하는 파일들의 갯수를 얻을 수 있게 됩니다. 결국 위의 내용을 실행하면 파일들을 찾고 그 목록 정보를 files라는 배열로 얻게 됩니다. 실제로 HELP 및 PRINT에 의하여 출력된 내용은 다음과 같습니다.

 

FILES           STRING    = Array[14]
          14

 

즉 files는 파일 목록에 해당되는 14개의 문자값들로 구성된 배열이고, 변수 n 역시 당연히 14라는 값을 갖게 됩니다. 배열 files의 내용을 다음과 같이 반복형 구문을 사용하여 출력해볼 수도 있습니다.

 

FOR j = 0, n-1 DO PRINT, files[j]

 

실제로 출력된 내용을 보면 다음과 같습니다.

 

test_dir/20150814_ace_epam_5m.txt
test_dir/20150814_ace_mag_1m.txt
test_dir/20150814_ace_sis_5m.txt
test_dir/20150814_ace_swepam_1m.txt
test_dir/20170907_002441_4096_0193.jpg
test_dir/20170907_004053_4096_0193.jpg
test_dir/20170907_005541_4096_0193.jpg
test_dir/20170907_011105_4096_0193.jpg
test_dir/20170907_012617_4096_0193.jpg
test_dir/20200529_065653_4096_0193.jpg
test_dir/20200529_071517_4096_0193.jpg
test_dir/20200529_074453_4096_0193.jpg
test_dir/20200529_075153_4096_0193.jpg
test_dir/20200529_080017_4096_0193.jpg

 

그러면 이와 같이 파일들의 목록을 구체적으로 확인할 수 있습니다. 여기까지의 내용은 일단 특정한 디렉토리 내에 존재하는 모든 파일들을 탐색하는 경우입니다. 물론 이러한 방식 외에도 제한조건을 걸어서 내가 원하는 방식으로 파일들을 탐색하는 것도 가능합니다. 예를 들면 파일명의 확장자가 jpg인 파일들만 찾고자 한다면 FILE_SEARCH 함수를 다음과 같이 사용하면 됩니다.

 

files = FILE_SEARCH('test_dir/*.jpg', COUNT=n)

HELP, files
PRINT, n

FOR j = 0, n-1 DO PRINT, files[j]

 

그 결과는 다음과 같습니다. 조건에 부합하는 10개의 파일들만 찾아낸 것을 알 수 있습니다.

 

FILES           STRING    = Array[10]
          10
test_dir/20170907_002441_4096_0193.jpg
test_dir/20170907_004053_4096_0193.jpg
test_dir/20170907_005541_4096_0193.jpg
test_dir/20170907_011105_4096_0193.jpg
test_dir/20170907_012617_4096_0193.jpg
test_dir/20200529_065653_4096_0193.jpg
test_dir/20200529_071517_4096_0193.jpg
test_dir/20200529_074453_4096_0193.jpg
test_dir/20200529_075153_4096_0193.jpg
test_dir/20200529_080017_4096_0193.jpg

 

그리고 파일명의 확장자가 txt인 파일들만 찾고자 한다면 FILE_SEARCH 함수를 다음과 같이 사용하면 됩니다. (결과를 출력하는 부분은 똑같습니다)

 

files = FILE_SEARCH('test_dir/*.txt', COUNT=n)

 

그 결과는 다음과 같습니다. 조건에 부합하는 4개의 파일들만 찾아낸 것을 알 수 있습니다.

 

FILES           STRING    = Array[4]
           4
test_dir/20150814_ace_epam_5m.txt
test_dir/20150814_ace_mag_1m.txt
test_dir/20150814_ace_sis_5m.txt
test_dir/20150814_ace_swepam_1m.txt

 

이번에는 확장자가 jpg인 파일들 중에서 년도가 2020인 파일들만 찾아봅시다. 이 경우에는 FILE_SEARCH 함수를 다음과 같이 사용하면 됩니다.

 

files = FILE_SEARCH('test_dir/2020*.jpg', COUNT=n)

 

그 결과는 다음과 같습니다. 조건에 부합하는 5개의 파일들만 찾아낸 것을 알 수 있습니다.

 

FILES           STRING    = Array[5]
           5
test_dir/20200529_065653_4096_0193.jpg
test_dir/20200529_071517_4096_0193.jpg
test_dir/20200529_074453_4096_0193.jpg
test_dir/20200529_075153_4096_0193.jpg
test_dir/20200529_080017_4096_0193.jpg

 

만약 확장자 상관없이 파일명 내에 "5m"이라는 문자열이 포함된 것들만 찾고자 한다면 FILE_SEARCH 함수를 다음과 같이 사용하면 됩니다.

 

files = FILE_SEARCH('test_dir/*5m*', COUNT=n)

 

그 결과는 다음과 같습니다. 조건에 부합하는 2개의 파일들만 찾아낸 것을 알 수 있습니다.

 

FILES           STRING    = Array[2]
           2
test_dir/20150814_ace_epam_5m.txt
test_dir/20150814_ace_sis_5m.txt

 

이와 같이 * 기호를 적절히 활용하여 다양한 제한조건을 제시할 수 있다는 점을 유념하시기 바랍니다.

 

그리고 이번에는 지정한 디렉토리 내에 또 다른 하위 디렉토리들이 존재하는 경우도 보고자 합니다. 예를 들면 다음과 같이 두 개의 하위 디렉토리들이 다른 파일들과 공존하는 상황으로 새롭게 가정해보겠습니다.

 

 

이와 같이 두 개의 하위 디렉토리들(data1, data2)까지 함께 존재하는 경우입니다. 일단 앞서 우리가 처음에 했던 것처럼 * 기호만을 사용하여 모든 파일들을 탐색하도록 해봅시다.

 

files = FILE_SEARCH('test_dir/*', COUNT=n)

 

그 결과는 다음과 같습니다.

 

FILES           STRING    = Array[16]
          16
test_dir/20150814_ace_epam_5m.txt
test_dir/20150814_ace_mag_1m.txt
test_dir/20150814_ace_sis_5m.txt
test_dir/20150814_ace_swepam_1m.txt
test_dir/20170907_002441_4096_0193.jpg
test_dir/20170907_004053_4096_0193.jpg
test_dir/20170907_005541_4096_0193.jpg
test_dir/20170907_011105_4096_0193.jpg
test_dir/20170907_012617_4096_0193.jpg
test_dir/20200529_065653_4096_0193.jpg
test_dir/20200529_071517_4096_0193.jpg
test_dir/20200529_074453_4096_0193.jpg
test_dir/20200529_075153_4096_0193.jpg
test_dir/20200529_080017_4096_0193.jpg
test_dir/data1
test_dir/data2

 

이와 같이 하위 디렉토리에 해당되는 항목들까지 모두 찾아줍니다. 즉 파일과 디렉토리들이 모두 한꺼번에 포함된 탐색 결과를 얻게 되는 셈입니다. 그런데 만약 파일들은 모두 제외하고 하위 디렉토리에 해당되는 항목들만 선별하고자 한다면 다음과 같이 /TEST_DIRECTORY라는 키워드를 함께 사용하면 됩니다.

 

files = FILE_SEARCH('test_dir/*', COUNT=n, /TEST_DIRECTORY)

 

그 결과는 다음과 같습니다.

 

FILES           STRING    = Array[2]
           2
test_dir/data1
test_dir/data2

 

사실 FILE_SEARCH 함수에는 그 외에도 더 많은 기능들이 내장되어 있지만 제가 여기서 그 모든 내용을 다 소개할 수는 없을 것 같습니다. 그래도 일단 기본적이고 핵심적인 내용은 여기서 충분히 소개를 한 것으로 생각합니다. 만약 더 자세한 내용이 궁금하시다면 IDL 도움말에서 FILE_SEARCH 함수에 관한 내용을 참조해보시기 바랍니다.

LIST