작성 중인 파일을 제외하고 폴더의 모든 파일을 복사하는 방법은 무엇입니까?

작성 중인 파일을 제외하고 폴더의 모든 파일을 복사하는 방법은 무엇입니까?

downloading다음을 통해 여러 파일을 폴더에 다운로드합니다.HTTPie. Bash 스크립트는 다운로드한 파일을 처리하는 것을 목표로 하고 있으며 다운로드한 파일을 다음과 같이 다른 폴더에 복사하려고 했습니다.

find /folder/downloading -type f -exec mv '{}' /folder/downloaded \;

하지만 아직 완료되지 않은 파일도 복사됩니다. -mmin +5명령을 추가하여 이전 파일로의 전송을 제한하려고 했습니다 . 파일이 기록 중인 상태로 두고 다운로드한 파일만 전송하는 효율적인 명령은 무엇입니까?

답변1

그다지 효율적이지는 않지만 다음을 수행할 수 있습니다.

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로 파일이 나열되어 있지 않은지 확인하십시오 .lsofmv

Linux 기반 운영 체제에서 일반적으로 발견되는 구현에는 쓰기 위해 열려 있는 파일을 확인하는 기능이 있지만 불행히도 psmisc해당 프로세스를 종료하는 데만 작동합니다 . 그러나 아무것도 하지 않는 의사 신호 0을 사용하면 여전히 사용할 수 있는 것 같습니다.fuser-w-k

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

관련 정보