작성중인 파일을 제외한 폴더의 모든 파일을 복사하는 방법은 무엇입니까? 한 파일을 처리하는 것을 목표로하며 다운로드

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 모드 lI s의 t of전에 세틸 mv보내고.

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()파일 설명자를 통해 수행 할 수 없음).