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


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


셸 질문 : 한 가지 예외로 코드를 이해한다고 생각합니다. 가 -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.