Linux 폴더에서 사용하지 않는 파일을 복사하는 방법

Linux 폴더에서 사용하지 않는 파일을 복사하는 방법

/opt/landing외부 시스템이 하루 종일 여러 파일을 저장하는 로그인 폴더가 있다고 가정해 보겠습니다 . 일부 파일은 작고 일부는 큽니다. 로그인 폴더에서 사용 가능한 폴더로 완전히 복사된 파일을 복사하는 스크립트를 작성하려고 합니다 /opt/available. 전송되는 파일을 복사하고 싶지 않습니다.

UNIX 스크립트 코드를 사용하여 이를 어떻게 달성할 수 있습니까?

답변1

그리고 zsh:

#! /bin/zsh -
files=( /opt/landing/**/*(D.:P) )
typeset -U inuse=( /proc/<->/fd/<->(D-.:P) )
cp ${files:|inuse} /opt/available/

현재 프로세스 파일 설명자에서 볼 수 없는 일반 파일을 그 안에 복사합니다. (우리는 프로세스 주소 공간에 매핑된 파일을 찾고 있지 않지만 파일이 거기에 도착하는 방식일 것이라고는 기대하지 않습니다.)

여기서는 파일이 읽기 모드로 열렸는지, 쓰기 모드로 열렸는지 확인하지 않습니다. 이를 수행하는 것은 파일을 보거나 /proc/*/fdinfo/*출력을 구문 분석 해야 하기 때문에 더 복잡합니다 lsof. 이는 사소한 일이 아닙니다.

프로세스에 속하지 않는 파일 설명자를 찾으려면 수퍼유저 권한이 필요합니다.

$inuseNFS 또는 기타 커널 네트워크 파일 시스템을 통해 업로드된 파일은 목록 에 표시되지 않습니다 . 각 작업 사이에 파일 이름이 바뀌거나 다시 열릴 수 있으므로 여전히 취약한 방법입니다. 업데이트할 수 있는 경우착륙 시스템파일 삭제를 마친 후 파일을 직접 이동하는 것이 더 안정적입니다.

  • **/glob 연산자는 다음을 나타냅니다.모든 수준의 하위 디렉터리.
  • <->임의의 10진수 시퀀스입니다.
  • (ND.:P)/ (N-.:P): 전역 한정자:
    • D: Dotglob: 파일 숨기기도 고려하세요
    • .: 오직정기적인파일(소켓, 디렉터리, 심볼릭 링크와 같은 다른 유형의 파일이 아님...)
    • -.:동일하지만 심볼릭 링크의 확인된 유형을 확인합니다.
    • :P: like는 realpath()파일에 대한 표준(심볼릭 링크 없음) 절대 경로를 가져옵니다.
  • typeset -U:배열 요소를 U고유하게 만듭니다(중복 요소 제거).
  • ${files:|inuse}:배열 빼기(사용되지 않은 파일).
  • 인수 목록이 너무 깁니다.파일이 너무 많은 경우 내장 기능을 사용 zargs하거나 (활성화하여 ) 오류를 방지할 수 있습니다.zshcpzmodload zsh/file

답변2

파일을 사용해서는 안 된다는 것뿐만 아니라 파일이 성공적으로 복사되었다는 제한도 추가할 수 있습니다. 두 번째 기준은 보내는 클라이언트에서 가장 잘 인식됩니다.

이것은 UNIX/Linux 문제가 아니라 알고리즘 문제입니다.

이러한 기준을 모두 충족하는 일반적인 방법(즉, 완전히 성공적으로 복사된 파일만 처리)은 임시 파일 이름 접미사를 사용하여 파일을 전송하고 파일이 성공적으로 완료된 경우에만 보낸 사람이 파일 이름을 바꾸도록 하는 것입니다.

고객

  • 클라이언트가 보냅니다.datafile.xml.tmp
  • datafile.xml.tmp전송이 성공적으로 완료되면 클라이언트 이름이 다음 으로 변경됩니다 .datafile.xml

섬기는 사람

  • 서버는 다음으로 끝나지 않는 파일을 찾습니다..tmp
  • 일치가 성공적으로 이루어지면 서버는 필요한 방식으로 파일을 처리합니다.
  • 서버는 "사용 되지 않은" .tmp파일 (하루 이상 변경되지 않은 파일)을 찾습니다.
  • 일치가 성공적으로 이루어지면 서버는 해당 임시 파일을 삭제합니다.

올바르게 인코딩되지 않는 클라이언트 측 전송 시스템을 처리하기 위해 수년 동안 사용해야 했던 다른 방법에는 파일 자체에서 파일 끝 표시를 찾는 것이 포함됩니다. 예를 들어 다음 과 같은 XML 인식 파서를 xmlstarlet적용 하면식별하기 쉽다convertImageMagick과 같은 도구를 사용하세요.

최악의 시나리오는 파일이 한동안 업데이트되지 않았기 때문에 파일이 완전한지 추측해야 하는 것입니다. 불행하게도 완전히 전송되었는지 또는 네트워크 오류로 인해 전송이 도중에 잘렸는지 알 수 있는 방법이 없습니다.

관련 정보