파일이 디렉터리에 복사되면 자동으로 명령 실행

파일이 디렉터리에 복사되면 자동으로 명령 실행

동일한 컴퓨터의 서로 다른 경로에 위치한 A와 B라는 두 개의 폴더가 있습니다. 폴더 A에 새 파일을 추가하면 자동으로 폴더 B에 복사하고 싶습니다.

내 파일:

/auto/std1/nat1/A
/auto/std2/nat2/B

현재 파일을 복사하기 위해 수행하는 작업은 다음과 같습니다.

cp -r A B

하지만 저는 이 프로세스가 백그라운드에서 자동으로 실행 A되기를 원합니다 B.

질문/질문이 추가되었습니다

파일을 복사할 때 특정 파일 형식에 대해 특정 작업을 수행하고 싶습니다. 예를 들어 zip폴더에 파일이 있으면 폴더의 해당 파일 A에 자동으로 복사되기를 원합니다 .unzipB

이것은 CentOS 7` 시스템에 있습니다.

답변1

rsync보너스 질문에 따라 아래에 제공한 셸 스크립트의 명령 아래에 다음 줄을 추가하세요. 나는 이것을 댓글에 썼지만 공식적으로 여기에 내 답변에 추가하겠습니다.

    find /auto/std2/nat2/B -name '*.zip' -exec sh -c 'unzip -d `dirname {}` {}' ';'

rsync그러면 폴더에서 /auto/std2/nat2/A복사된 모든 zip 파일의 압축 해제가 처리됩니다./auto/std2/nat2/B



rsync이미 설치 했다면 cron을 실행하고 rsync파일 미러를 관리하면 어떨까요?

스크립트 만들기myrsyncscript.sh

실행 가능하게 만드는 것을 잊지 마세요:chmod 700 myrsyncscript.sh

#!/bin/sh

LOCKFILE=/tmp/.hiddenrsync.lock

if [ -e $LOCKFILE ]
        then
        echo "Lockfile exists, process currently running."
        echo "If no processes exist, remove $LOCKFILE to clear."
        echo "Exiting..."
#        mailx -s "Rsync Lock - Lock File found" [email protected] <<+
#Lockfile exists, process currently running.
#If no processes exist, remove $LOCKFILE to clear.
#+
        exit
fi

touch $LOCKFILE
timestamp=`date +%Y-%m-%d::%H:%M:%s`
echo "Process started at: $timestamp" >> $LOCKFILE

## Run Rsync if no Lockfile
rsync -a --no-compress /auto/std1/nat1/A /auto/std2/nat2/B


echo "Task Finished, removing lock file now at `date +%Y-%m-%d::%H:%M:%s`"
rm $LOCKFILE

옵션 분석:

-a is for archive, which preserves ownership, permissions etc.
--no-compress as there's no lack of bandwidth between local devices

고려할 수 있는 다른 옵션man rsync:

--기존 무시

싱크에 있는 파일 업데이트 건너뛰기

- 갱신

이렇게 하면 rsync가 대상에 존재하고 소스 파일보다 수정 시간이 최신인 모든 파일을 건너뛰게 됩니다. (기존 대상 파일의 수정 시간이 소스 파일의 수정 시간과 동일하고 크기가 다른 경우 업데이트됩니다.) 이는 심볼릭 링크나 기타 특수 파일의 복사에는 영향을 미치지 않습니다. 또한 보낸 사람과 받는 사람 간의 파일 형식 차이는 개체의 날짜에 관계없이 항상 업데이트될 만큼 중요한 것으로 간주됩니다. 즉, 원본에 디렉터리가 있고 대상에 파일이 있는 경우 타임스탬프에 관계없이 전송이 발생합니다.

이 옵션은 제외가 아닌 전송 규칙이므로 파일 목록에 들어가는 데이터 및 삭제에 영향을 미치지 않습니다. 단순히 수신자가 전송을 요청하는 파일을 제한합니다.

다음과 같이 cron에 추가하고 가장 편안하다고 느끼는 주파수로 빈도를 설정하십시오.

cron을 열고 crontab -e다음을 추가합니다.

### Every 5 minutes
*/5 * * * * /path/to/my/script/myrsyncscript.sh > /path/to/my/logfile 2>&1 

# * * * * *  command to execute
 # │ │ │ │ │
 # │ │ │ │ │
 # │ │ │ │ └───── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
 # │ │ │ └────────── month (1 - 12)
 # │ │ └─────────────── day of month (1 - 31)
 # │ └──────────────────── hour (0 - 23)
 # └───────────────────────── min (0 - 59)

답변2

inotifywait 및 리듬 이벤트 응답을 사용하여 @Izkata의 제안을 구현하여 rsync를 5분마다 최대 1로 유지하는 동시에 초기 변경 사항에 신속하게 응답합니다.

#!/bin/sh
# usage: whateveryouwanttotcallthis "$directorytowatch" rsync args here

cd "$1" || { echo "${0##*/}: can't cd to $1"; exit 1; }
shift
rsync -nq "$@" || { echo "rsync doesn't like your $# arguments $@"; exit 1; }

notbefore=0
watchlock=.lock.inotifywait
rsynclock=.lock.rsync-pending

mkdir $watchlock ||
       { echo "${0##*/}: already running, rmdir '$PWD/$watchlock' if kill -9 took it out"
         exit 1;
       }
trap "rmdir '$watchlock'" 0 1 2 3 15

inotifywait -m -e close-write . |    # maybe also add move
        while read; do
                mkdir $rsynclock 2>&- || continue
                schedule=$(( notbefore <= (now=`date +%s`+2) ? (now+2)
                                                           : (notbefore) ))
                notbefore=$((schedule+300))
                ( ( trap "rmdir '$rsynclock'" 0 1 2 3 15
                    sleep $(( schedule-now ))
                  )
                  # substitute your payload here
                  rsync --exclude='.lock.*' "$@" \
                          || echo ssia | mail -s "${0##*/} '$PWD' rsync failed" opswatch
                ) &
        done

2초 지연은 소규모 버스트의 일괄 처리에 도움이 되며 쓰기가 완료되면 특정 항목의 이름을 바꿀 시간을 허용합니다. 어쩌면 15초가 더 좋을 수도 있습니다.

Windows ATM에서는 테스트할 수 없지만 적어도 매우 유사할 것이라고 믿습니다.

답변3

DevNull을 사용하여 주기적으로 재동기화되는 콘텐츠를 제안할 수 있습니다. 개인적으로 사용하겠습니다inotify. 이것은 폴더를 모니터링할 수 있는 훌륭한 도구입니다. 감시점을 설정하고 파일 시스템 변경이 발생할 때 알려줍니다. 그런 다음 .NET의 트리거를 기반으로 rsync를 트리거할 수 있습니다 inotify.

마지막에 언급한 특정 사례의 경우 inotify의 트리거를 사용하여 변경된 내용을 확인한 다음 간단한 bash 스크립트를 작성하여 폴더 A에 추가된 zip 파일인지 확인하고, 그렇다면 대신 zip을 복사하기만 하면 폴더 B(또는 원하는 다른 작업)에 압축을 풀 수 있습니다.

관련 정보