2012-03-22 1 views
2

파일 내용을 고려하여 디렉토리의 최종 수정 시간을 계산할 수 있습니까?포함 된 파일 내용을 기반으로 한 디렉토리의 최종 변경 시간?

우리는 일련의 업로드 디렉토리를보고 사용자 FTP 세션이 완료되었는지 확인하려고합니다.

사용자는 특정 파일 세트를 특정 디렉토리에 업로드하고 있으며, 해당 디렉토리 내의 마지막 파일이 N 분 이내에 변경되지 않았 으면이를 감지하고 싶습니다.

find . -mmin +5 -mmin -10 -type d -ls 
: 분, 우리는 5 개 이상의 유휴왔다 디렉토리를 찾으려면이 시작

(. 우리는 "FTP 세션이 이루어집니다"에 대한 프록시로서 이것을 사용), 미만 (10)

여기에 사용 된 디렉터리 타임 스탬프는 가장 최근 파일이 디렉터리에 추가 된 시간을 기반으로합니다.

나는 Directory last modified date을 읽었으며 디렉토리의 파일 내용이 업데이트 될 때 변경되지 않으므로 디렉토리에 대한 mtime 또는 mmin 읽기가 작동하지 않음이 분명합니다. 따라서 위의 파일은 마지막 파일이 업로드하는 데 10 분 이상 걸릴 수있는 대용량 파일 인 경우 디렉토리가 실제로 유휴 상태가 아닐 수 있으므로 (즉 모든 파일이 변경되지 않음)이 작동하지 않습니다.

마지막으로 변경된 파일의 mtime을 타임 스탬프로 사용하지만 여전히 디렉토리 수준에서 작동하는 셸 기반 대안 (이상적으로는 find 명령의 구성이 이상적입니다) (즉, 우리는 하나의 디렉토리 안에있는 모든 파일을 기반으로 여러 히트 수)?

+2

대체 솔루션을 고려하십시오. 원하는 옵션을 찾지 못했을 것입니다 (코드를 작성할 수 있습니다). 계약의 일부로 상업용 소스에서 파일을 가져 오는 경우 특수 파일 '플래그'파일을 마지막 파일로 보내달라고 요청하는 것이 부당하지 않습니다. 그런 다음 플래그 파일을 찾고 반복 할 수 있습니다. 도착한 시점에 처리를 시작할 수 있습니다 (유효성 확인 단계가 포함되어 있어야 모든 파일이 있는지, 어제와 동일하지 않은지 확인해야 함). , 비어 있지 않음 (플래그가 없으면 플래그 파일은 크기가 – shellter

+0

인 파일 목록 일 수 있음) 불행히도 이러한 파일은 클라이언트 사용자 인터페이스에 파일을 저장하는 기술자가 아닌 사용자가 주로 사용합니다. 이 깃발 메서드를 배경으로 사용할 수는 있지만 사용자 지정 클라이언트 배포가 작동하지 않는 시나리오에 대한 대비가 여전히 도움이 될 것입니다. – Ramon

답변

1

나는 또한 "대체 솔루션"측면에 있습니다. 울타리.

FTP 서버의 로그에 액세스 할 수있는 경우 해당 로그를 분석하여 업로드 성공 여부를 확인하는 것이 좋습니다. 이러한 종류의 이벤트 트리거 방식은 질문에 설명 된 것과 같은 폴링 방식보다 빠르고, 안정성이 높으며,로드가 적습니다.

이 방법은 물론 FTP 서버에 따라 다릅니다. 나는 누구의 로그를 포함 라인과 같이 하나 개의 실행 vsftpd 있습니다

Fri Mar 23 07:36:02 2012 [pid 94378] [joe] OK LOGIN: Client "10.8.7.16" 
Fri Mar 23 07:36:12 2012 [pid 94380] [joe] OK UPLOAD: Client "10.8.7.16", "/path/to/file.zip", 8395136 bytes, 845.75Kbyte/sec 
Fri Mar 23 07:36:12 2012 [pid 94380] [joe] OK CHMOD: Client "10.8.7.16", "/path/to/file.zip 644" 

vsftpd를 성공적으로 파일을 저장 한 경우에만 추가됩니다 UPLOAD 라인. 이 같은 쉘 스크립트에서이 구문을 분석 할 수 :

#!/bin/sh 

tail -F /var/log/vsftpd.log | while read line; do 
    if echo "$line" | grep -q 'OK UPLOAD:'; then 
    filename=$(echo "$line" | cut -d, -f2) 
    if [ -s "$filename" ]; then 
     # do something with $filename 
    fi 
    fi 
done 

그것은 아니에요 좋은 호텔 쉘 스크립트, 나는 그것을 자신을 사용하고 있다면 아마 다르게 조금을 써서 정직하게,하지만이 아이디어를 보여 충분히 잘.

+0

while 루프의 맨 아래에 'sleep 60'또는 300 또는 600이라는 문자가 있습니다. ;-) 좋은 대안입니다! – shellter

+0

감사합니다. 사실, 다음에 업로드 된 파일을 처리하기 전에 어떤 이유로 지연되지 않는 한, while 루프의 맨 아래에 "sleep"을 원하지 않을 것입니다. 'tail -F'를 사용하기 때문에, 로그 출력은 새로운 로그 항목에 대해서만 루프를 트리거합니다. '# do something' 코드가 실행되면이 스크립트는 새로운 로그 데이터가 오기를 기다립니다. 폴링 솔루션에는 지연이 필요하지만 폴링 대신 * [이벤트 구동] (http://en.wikipedia.org/wiki/Event-driven_programming) *입니다. – ghoti

2

@ shellter의 의견에 동의하는 데 플래그 파일을 사용하는 것이 가장 좋습니다. 그 파일을 업로드하는 것에 동의하는 사용자의 생각에 달려 있습니다.

는 현재 디렉토리에서 가장 최근의 파일을 찾으려면

find . -type f -printf "%[email protected] %p\n" | sort -nr | head -1 

출력은 2 개 필드입니다 : 신기원부터 초

  1. 시간, 분수 마이크로
  2. 상대 경로 파일로
+0

감사 글렌 (Good Glenn) 이것은 최소한 임시 솔루션을 얻으려는 시도입니다. – Ramon