HTTPiedownloading
통해 폴더에 여러 파일을 다운로드합니다 . bash 스크립트는 다운로드 한 파일을 처리하는 것을 목표로하며 다운로드 한 파일을 다른 폴더에 복사하려고했습니다.
find /folder/downloading -type f -exec mv '{}' /folder/downloaded \;
그러나 이것은 아직 완료되지 않은 파일도 복사합니다. -mmin +5
명령 에 추가 하여 이전 파일로의 전송을 제한하려고했습니다 . 파일을 남겨두고 다운로드 한 파일 만 전송하는 효율적인 명령은 무엇입니까?
답변
매우 효율적이지는 않지만 다음을 수행 할 수 있습니다.
find /folder/downloading -type f -exec sh -c '
for file do
lsof -F a "$file" | grep -q w || mv "$file" /folder/downloaded
done' sh {} +
즉, 파일이 나열되지 않았는지 확인이다 w
의식 a
에서 CCESS 모드 l
I s
의 t o
펜 f
전에 세틸 m
오 v
보내고.
psmisc
의 구현 fuser
일반적으로 리눅스 기반의 운영 체제에서 발견는이 -w
와 기능 (파일을 쓰기 위해 열을 확인하기 위해)하지만 불행히도 그것은 단지 일 -k
해당 프로세스를 종료 할 수 있습니다. 그러나 아무것도하지 않는 의사 신호 0을 사용하여 여전히 사용할 수있는 것 같습니다.
find /folder/downloading -type f -exec sh -c '
for file do
fuser -s -w -k -0 "$file" || mv "$file" /folder/downloaded
done' sh {} +
이동을 방해하는 프로세스가 무엇인지 확인하려면을 제거하십시오 -s
(또는으로 교체 -v
).
해당 명령을 수퍼 유저로 실행하지 않으면 프로세스에 대한 정보 만 얻을 수 있습니다. 파일을 다운로드하는 프로세스가 다른 사용자로 실행중인 경우 탐지되지 않은 상태로 유지됩니다.
또한 파일을 다른 파일 시스템으로 이동하지 않는 한 파일을 이동해도 현재 파일에 기록중인 프로세스가 파일에 대한 쓰기를 마치는 것을 막을 수는 없습니다.
그들이 쓰기를 마친 후, 파일이 더 이상 그러나 그들은 나중에 할 수 있도록 설계했습니다 무엇 따라, 그들은 혼동되지 않을 수있다 (예를 들어 그들은 그것을 다운로드 후 파일의 일부 속성을 변경하고 싶은 경우 그렇게 하지 파일 설명자를 통해 ( chmod()
vs fchmod()
와 같거나 utimes()
파일 설명자를 통해 수행 할 수 없음).