IT한 것

python 파일 모니터링 및 지정한 곳으로 옮기기

lovian 2021. 4. 2. 23:11

시놀로지 나스를 사용하게 되면서, 나스에게 다운로드를 시키고, 적절한 곳으로 파일을 이용하는 것이 필요했다.

이미 다른 괜찮아 보이는 모듈이 있기는 했는데, 무슨 일인지 잘 설치가 되지 않아 간단하게 스크립트로 개발해봤다.

 

아래의 코드를 실행하면 /volume1/download라는 디렉터리를 탐색하고, *.mp3, *.avi를 지정한 경로로 파일 이동해준다.

#!/bin/python
#-*- coding: UTF-8 -*-

import os
import fnmatch
import itertools
import shutil

destPattern = []
destDir = []

def add(pattern, dir):
    if (os.path.isdir(dir) != True):
        return False
    destPattern.append(pattern)

    if (dir[len(dir) - 1] != os.path.sep):
        dir = dir + os.path.sep

    destDir.append(dir)


def find_file(path, checkFile):
    dirs = os.listdir(path)

    for dir in dirs:
        p = os.path.join(path, dir)
        if (os.path.isdir(p)):
            find_file(p, checkFile)
        else:
            checkFile(dir, p)
def checkFile(name, targetPath):
    for pattern, dir in zip(destPattern, destDir):
        filtered = fnmatch.fnmatch(name, pattern)
        if(True != filtered):
            continue;
        print("move file from=({0}) to=({1})".format(targetPath, dir + name))
        os.system('mv "{0}" "{1}"'.format(targetPath, dir + name))


add('*.mp3', '/volume1/audio')
add('*.avi', '/volume1/video')


find_file('/volume1/download', checkFile)            

 

여기서 파일 이동 명령을 쉘에서 mv 명령을 이용하도록 한 것은, 아직 파이썬을 잘 몰라서 shutil.move 를 써봤는데, 같은 디스크 내에서 파일 이동임에도 복사로 동작했기 때문에, 영상 파일의 이동이 아주 느려서 대안으로 사용했다. Windows 플랫폼이라면 mv를 move 명령으로 바꾸어 사용하면 될 것이다 (경로 구분자 같은거도 바꾸어야 겠죠?)

 

그리고 정규식보다는 일반인 사용자 기준에서 편하도록 와일드 카드를 사용할 수 있게 했다.

add('DSC*.png', '/volome1/picture/camera')

등 상황에 맞게 사용하면 편할 것 같다.

 

그리고 끝이 아니다.

이 스크립트는 1회성으로 동작하고 종료하기 때문에 주기적으로 실행해줘야한다.

일반 linux 사용자라면 cron tab에 등록하여 사용하고,

윈도우 사용자라면 pm 이였나? 여튼

각 플랫폼에서 제공하는 스케쥴러에 설정해서 사용해야한다.

 

나 같은 경우 synology 환경이였기 때문에 작업 스케쥴러에 등록하여 사용했다