새 파일이 나타나면 즉시 데이터를 USB 키에 동기화하는 매우 간단한 bash 스크립트가 있습니다. 잘 작성되지는 않았지만 작동하지만 CPU 시간을 최소화하고 싶어서 사용했지만 sleep
inotifywait를 동기화 트리거로 사용하고 있기 때문에 스크립트는 추가된 새 파일마다 1초의 절전 모드를 추가합니다(작은 파일이 많이 있습니다). 내 해결책은 read
inotifywait 출력의 최신 줄만 읽는 것입니다. tail -1로 파이핑하여 수행하고 싶지만 작동하지 않는 것 같습니다.
#!/bin/bash
watched_path=".wine/drive_c/Data"
rm -r "$HOME/$watched_path/"*
inotifywait -r -m "$HOME/$watched_path" --format "%e %w%f" -e create -e moved_to |
while read action full_path; do
sleep 1
file=${full_path##*$watched_path}
echo "'$file' appeared in directory '$watched_path' via '$action'"
USB="USBKEY"
# Wait for USB to be connected before syncing.
until [ -e /media/$USER/$USB ]; do
echo "Connect USB for sync."
sleep 5
done
rsync -r "$HOME/$watched_path" /media/$USER/$USB
echo "Sync complete."
done
전체 폴더를 동기화하므로 inotifywait를 사용하여 한 줄을 놓치더라도 문제가 되지 않지만 읽을 때 최신 파일(따라서 최신 줄) 다음에 동기화해야 합니다. 이는 파일 전송을 중단한 순간부터 while 루프가 다시 중단되기 전에 최대 한 번 더 실행된다는 것을 의미합니다.
어떻게 읽을 수 있어?최신 행만inotifywait 출력? 이 문제를 피하기 위한 다른 제안이 있으면 괜찮습니다. 하지만 여전히 답변에 관심이 있습니다.
답변1
나는 당신이 요구하는 것이 더 복잡한 시나리오라고 생각합니다. "마지막" 도착 파일을 식별하는 방법을 설명하지 않았으므로 하나 이상의 파일이 전송되었기 때문에 5초 동안 파일이 비활성화된 후 시간 초과됩니다.
- 플래그 설정 = 대기
- 병렬: 파일이 알림을 받을 때마다 플래그 = not_done을 설정합니다.
플래그 == not_done이 될 때까지 기다리세요.
루프 시작
- USB 연결을 기다리고 동기화 프로세스를 시작합니다(
rsync
). - 새 파일이 전송되면 플래그=not_done을 설정합니다.
- 그렇지 않으면
- 플래그 ==like_done이면 플래그 =determinly_done을 설정하고, 그렇지 않으면 플래그 =like_done을 설정합니다.
- 5초도 안 걸리면 남은 시간을 기다려
- USB 연결을 기다리고 동기화 프로세스를 시작합니다(
- 플래그 ==define_done까지 반복
메인 프로세스와 병렬 프로세스 사이에 IPC가 필요하기 때문에 inotifywait
플래그를 파일로 구현하거나 파일 이름 집합으로 구현하는 것을 고려해 보겠습니다.
내가 아는 한쉽지 않다rsync
새 파일이 전송되었는지 확인합니다 . 이전과 이후의 대상 디렉터리의 내용을 비교해야 할 수도 있습니다.