때때로 새 파일이 나타나는 폴더 A가 있습니다. 한 시간 동안 새 파일이 없을 수도 있지만 초당 여러 개의 새 파일이 있을 수도 있습니다. 모든 파일에는 이름에 고유한 타임스탬프와 다양한 파일 확장자가 있습니다. 콘텐츠가 폴더에 저장되는 내용, 방법, 시기를 수정할 수 있는 방법은 없습니다. 이것은 FTP를 통해 외부에서 액세스할 수 있는 내 컴퓨터의 디렉토리입니다.
다른 폴더에서 BI는 새 파일이 생성되는 즉시 폴더 A에 "Newest.jpg"라는 최신 jpg 파일의 복사본을 가져오려고 합니다. 1초만 지연해 보세요. 웹캠의 출력을 모방해야 합니다.
Ubuntu 14.04 LTS를 실행하는 Raspberry와 같은 시스템에서 이를 수행하는 가장 좋고 계산 비용이 가장 적게 드는 방법은 무엇입니까?
답변1
패키지를 설치하면 새 파일이 생성될 때 이벤트를 가져오는 inotify-tools
간단한 스크립트를 작성할 수 있습니다 .inotify
inotifywait -m -e create --format %f A |
while read filename
do ln -f A/"$filename" B/Newest.jpg
done
watch 디렉토리에 새 파일이 생성될 때마다 A
이벤트가 지정된 형식으로 인쇄됩니다 %f
. 즉, 파일 이름만 인쇄됩니다. 쉘 루프는 이 내용을 읽고 링크를 생성합니다. 파일 생성과 링크 설정 사이에 지연이 없어야 합니다.
일치에서 특정 파일 이름을 제외해야 하는 경우 에 정규식 --exclude
패턴을 추가하여 파일을 제외 할 수 있습니다 . 또는 쉘 루프 내에서 원하는 패턴을 테스트하는 것이 더 간단할 수도 있습니다. Bash를 사용하는 경우 시작 부분에 간단히 추가할 수 있습니다 .inotifywait
--exclude '.*.wav$'
*.wav
*.jpg
do
[[ "$filename" != *.jpg ]] && continue
이는 정규 표현식이 아닌 glob 패턴을 테스트합니다.
답변2
먼저 심볼릭 링크를 만듭니다.어느파일을 디렉터리에 배치하고 이름을 "최신"으로 지정합니다.
ln -s somefile.jpg latest
그런 다음 필요에 따라 디렉터리에서 다음 명령을 실행합니다.
find . -type f -newer latest -exec ln -fs {} latest \;
평가 순서가 중요하지 않기 때문에 이는 실제로 매우 우아합니다. 명령의 끝은 편집하다:이것은 잘못된 것입니다. ~에 따르면POSIX:latest
디렉토리의 최신 파일에 대한 심볼릭 링크입니다.
이것-사용자,-그룹, 그리고-최신각 기본은 해당 인수를 한 번만 평가할 수 있습니다.
이로 인해 이 접근 방식이 사실상 쓸모 없게 되지만 여전히 이를 통해 뭔가를 할 수 있습니다. 그러나 이 사실을 감안할 때 inotify
다른 답변에서 제안한 대로 사용 하겠습니다 .
얼마나 많은 CPU 사이클을 소비할지 모르지만 다음을 실행하십시오.
while true; do find . -type f -name '*.jpg' -newer latest -exec ln -fs {} latest \; ; done
latest
항상 가능한 한 빨리 최신 jpeg 파일을 가리키는 지 확인합니다 . 그렇지 않으면예상되는이미지가 초당 두 번 이상 업데이트되는 경우 while sleep 1
대신 를 사용할 수 있습니다 while true
.
디렉토리의 파일 수가 증가함에 따라 이는 점점 더 비효율적이 됩니다. 이 문제를 처리하는 방법에 대한 몇 가지 아이디어가 있지만 FTP에 있으므로 적용되지 않을 수 있습니다.
내 첫 번째 생각은 find
동일한 명령의 일부로 이전 파일을 다른 디렉터리로 이동하여 다시 평가할 필요가 없도록 하는 것이었습니다. 문제는 latest
심볼릭 링크가 가리키는 파일이 최신이 아니기 때문에 "오래된" 파일로 간주된다는 것입니다. 우리는 움직일 수 없어저것그렇지 않으면 심볼릭 링크가 깨질 것입니다!
그러나 우리는 .jpg라는 파일만 평가하므로 다음 latest
을 만들 수 있습니다.하드 링크심볼릭 링크 대신:
mkdir ../oldfiles
while sleep 1; do find . -type f -name '*.jpg' \( -newer latest -exec ln -f {} latest \; -o -exec mv {} ../oldfiles \; \)
다시 말하지만, 이것이 ftp에서 어떻게 작동할지 모르겠지만 로컬 파일의 경우에는 잘 작동할 것입니다.