이 find 명령을 최적화하려고 합니다. 추가 처리를 위해 한 묶음(때로는 거의 백만 개)의 파일을 디렉터리로 이동해야 합니다. 많은 수의 파일을 실행하는 데 몇 시간이 걸릴 수 있으므로 이 명령의 속도를 높이는 방법을 찾고 있습니다. 문제는 아직 기록 중인 파일을 이동하고 싶지 않기 때문에 이동하기 전에 파일을 최소 1분 동안 보관해야 한다는 것입니다.
find path -name *.cdr.xml -mmin +1 -exec mv {} /path
편집하다:이 명령은 Python 스크립트의 일부로 실행되며 Python 스크립트 실행을 계속하려면 모든 파일을 찾아서 이동할 때까지 기다려야 합니다.
모든 파일 이름은 UUID입니다.
답변1
포크가 한 번만 발생하는 엔딩을 사용하면 성능이 향상될 수 있습니다 +
.-exec
find
-exec
;
그리고 의 경우 -exec
매번 새로운 매개변수를 포크합니다.
따라서 다음을 사용할 수 있습니다.
find path -type f -name '*.cdr.xml' -mmin +1 -exec mv -t /path {} +
파일 이름이 중복될 가능성이 있는 경우:
find path -type f -name '*.cdr.xml' -mmin +1 -exec mv -it /path {} +
또는
find path -type f -name '*.cdr.xml' -mmin +1 -exec mv --backup=numbered -t /path {} +
--backup=numbered
mv
대상의 파일 이름이 동일한 경우 덮어쓰기가 아닌 번호가 지정된 파일 백업이 생성됩니다.
답변2
watchdog을 살펴볼 수 있습니다 (https://github.com/gorakhargosh/watchdog/) Python에서 모든 로직을 유지하려면 디렉토리를 관찰하고 수정 없이 1분 후에 각 파일을 이동할 수 있습니다.
또 다른 해결책은 다음을 사용하는 것입니다.동기화모든 파일 전송찾다구성 대신 출력-구현하다.
약간의 설명:
find ... -exec ... \;
-> 각 결과에 대해 명령을 실행하므로 오버헤드가 많이 추가되고 매우 느립니다.
find ... -exec ... +
-> 이렇게 하면 모든 결과가 연결되고 명령이 한 번만 실행됩니다. 이는 매우 빠르지만 명령에 대한 셸 문자 제한에 도달할 수 있습니다(특히 수백만 개의 파일의 경우).
지금은동기화:
find path -name *.cdr.xml -mmin +1 -print0 | rsync --remove-source-files -0 --files-from=- ${DESTINATION}
설명하다:
find ... -print0 |
-> 이렇게 하면 NULL로 구분된 모든 결과가 다른 쪽 끝에서 rsync에 의해 처리될 파이프로 전달됩니다.
--remove-source-files
-> 에서와 같이 설명이 필요하지 않습니다 mv
.
--files-from=-
-> 파이프의 표준 입력에서 읽습니다.
-0
-> 파이프의 행 대신 NULL로 끝나는 목록을 읽습니다.
왜 NULL인가요? ...작업 속도를 조금 높이기 위해 NULL은 새 행보다 적은 바이트를 차지하고 이를 백만으로 늘리면 많은 바이트를 절약할 수 있습니다.