Dropbox 폴더에 파일이로드 될 때 inotifywait를 사용하여 파일 이동


12

CentOS의 보관함에 나타나는 즉시 다른 폴더로 파일을 이동하는 방법을 찾으려고합니다.

나는 단서를 찾기 위해 인터넷을 닦았지만 inotify파일이 나타날 때 파일을 처리하는 스크립트를 호출하는 데 사용해야한다는 사실 이상을 얻을 수는 없습니다 .

내 BASH 지식은 매우 제한되어 있으며 PHP로 작성할 수 있을지 의심됩니다.

즉, inotify?를 사용하여 표시되는 즉시 다른 폴더로 파일을 어떻게 이동할 수 있습니까?


파일 이름이 일관되게 예측 가능합니까? 아니면 위치입니까? 더 많은 세부 사항이 될 것입니다 도움이 ...
jasonwryan

@jasonwryan 보관 용 폴더이므로 위치가 일관됩니다. 그리고 해당 폴더에 놓인 모든 파일에 적용됩니다 .
Ortix92

답변:


13

이것은 간단한 접근법입니다.

#!/usr/bin/env bash

dir=/home/ortix/Dropbox/new/
target=/home/ortix/movedfiles/

inotifywait -m "$dir" --format '%w%f' -e create |
    while read file; do
        mv "$file" "$target"
    done

이동하려는 파일 유형에 대한 자세한 내용으로 검사, 로깅 등을 추가 할 수 있습니다.


제안 된 답변 중 하나를 테스트 할 수 없었습니다. 일이 생겼다. 최대한 빨리 할 것입니다! 그래도 질문이 있습니다. 이것을 bash 파일에 넣고 실행하면 백그라운드에서 실행될 것이라고 가정합니까? 나는 항상 스크립트가 1 번 실행된다는 느낌을 가지고 있지만 여기서 inotifywait는 계속 실행되고 있습니까?
Ortix92

2
디스크에서 완전히 복사되지 않은 파일에서 파일을 재생 create하므로 이벤트 수신 대기 가 올바르지 mv않습니다. close_write대신 이벤트를 사용하여 @Gilles 응답을 참조하십시오 .
fduff

3
@fduff Gilles의 답변을 보는 것이 항상 올바른 일입니다 ...
jasonwryan

17

이 명령 inotifywait은 지정된 디렉토리의 내용이 변경 될 때마다 메시지를 인쇄합니다. 파일을 만들 때가 아니라 Dropbox에서 다운로드를 마치면 올바른 이벤트를 선택해야합니다. Dropbox의 작동 방식을 정확히 모르겠습니다. 최종 위치에서 파일에 쓰면 close_write이벤트를 청취하십시오 . 파일에 임시 위치에 기록한 다음 제 위치로 이동하면 moved_to이벤트를 수신하십시오 . 이벤트 수신 대기 (기본적으로 다음 이벤트 만 대기)하고 관련 메시지 만 인쇄하도록 옵션 -m -qinotifywait전달하십시오.

cd ~/Dropbox/myfolder
inotifywait -m -q -e close_write --format %f . | while IFS= read -r file; do
  cp -p "$file" /path/to/other/directory
done

1
이름에 개행 문자가 포함 된 파일은 실패합니다. inotifywaitnull로 끝나는 파일 이름을 출력 하는 방법을 찾을 수 없습니다 . 내가 할 수있는 가장 좋은 예를 들어, 줄 바꿈보다 적은 가능성 문자를 사용하는 것이었다 %f$'\001', 그리고 사용 -d $'\001'while IFS= read -rxargs.
추후 공지가있을 때까지 일시 중지되었습니다.

1
@DennisWilliamson 그렇습니다 inotifywait. //%f감시 할 경로가없는 한 파일 이름에 이중 슬래시가 포함되지 않으므로,와 같은 것을 사용할 수 있습니다 . 그런 다음 귀찮음은 구문 분석 측에 있습니다.
Gilles 'SO- 악마 그만해
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.