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


12

HTTPiedownloading 통해 폴더에 여러 파일을 다운로드합니다 . bash 스크립트는 다운로드 한 파일을 처리하는 것을 목표로하며 다운로드 한 파일을 다른 폴더에 복사하려고했습니다.

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

그러나 이것은 아직 완료되지 않은 파일도 복사합니다. -mmin +5명령 에 추가 하여 이전 파일로의 전송을 제한하려고했습니다 . 파일을 남겨두고 다운로드 한 파일 만 전송하는 효율적인 명령은 무엇입니까?


동일한 파일 시스템으로 복사하고 다운로더의 이름을 바꾸지 않도록 설정 한 경우 (다운로드 %.part한 다음 %로 이름 바꾸기) 그런 다음 다운로더가 제대로 작동하면 (이상한 일이 없으면 mv) 파일의 이름을 바꿀 수 있어야합니다 ( ).
ctrl-alt-delor

1
어떤 종류의 처리를하려고합니까? 파이프 라인 사용과 같이 훨씬 간단한 옵션을 사용할 수 있습니다.
gardenhead

답변:


11

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

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


셸 질문 : 한 가지 예외로 코드를 이해한다고 생각합니다. 가 -exec실행 sh한 명령 (와 -c '...')과는 {} +그것을 한 번에 그 명령에 하나 개 이상의 결과를 넣어 알려줍니다. 내가 이해하지 못하는 sh것은 명령 후에 또 다른 것이있는 이유 입니다. 내가 무엇을 놓치고 있습니까?
Joe

2
@ 조, 그게 인라인 스크립트의 내용 $0입니다. 즉, 해당 인라인 스크립트에 이름 을 부여합니다 . 이 이름은 예 <name>: fuser: command not found를 들어 오류 메시지에 사용될 수 sh있으므로이 오류 메시지를보고하는 내용을 명확하게하기 위해 일반적으로이 방법을 사용하는 것이 좋습니다. 인라인 스크립트).
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.