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

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

여러 파일을 폴더에 다운로드하여 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 {} +

즉 , 닫기 전에 파일의 i에 파일이 w의식 액세스 모드 로 나열되어 있지 않은지 확인하십시오 .alsofmv

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

관련 정보