마운트 지점에서 파일을 이동하려면 Windows 공유를 올바르게 마운트하세요.

마운트 지점에서 파일을 이동하려면 Windows 공유를 올바르게 마운트하세요.

이 질문은 내가 가졌던 질문에서 비롯되었습니다.스택 교환.

저는 Windows 공유를 마운트 mount -t cifs -o username=username,password=password,rw,nounix,iocharset=utf8,file_mode=0777,dir_mode=0777 //192.168.1.120/storage /mnt/storage한 다음 데비안 시스템의 마운트 지점에서 스크립트를 실행했습니다.

마운트 지점에는 /mnt/storage빠르게 증가하는 파일 수가 포함되며, 이 파일은 일괄적으로 하위 디렉터리로 이동되고 처리됩니다.

내 문제는 이동이 상대적으로 느리다는 것이고, 파일 테이블(파일이 하드 드라이브에 있는 정보만)만 변경할 수는 없기 때문에 걱정됩니다.

저는 현재 이것을 파이썬에서 사용하고 있지만 subprocess 를 shutil.move(src,dst)사용하거나 사용하는 것도 고려하고 있습니다 .os.rename(src,dst)mv

내 두려움이 맞나요? 그렇다면 방법이 있나요?보다 효율적으로 설치?

편집하다: 방금 문서를 다시 살펴보고 shutil.move()다음 내용을 읽었습니다.

If the destination is on the current filesystem, then os.rename() is used.
Otherwise, src is copied (using shutil.copy2()) to dst and then removed.

이게 문제가 될 것 같긴 한데 그렇지 않다면"현재 파일 시스템에서", 내가 그런 사람인지 어떻게 알 수 있나요?"현재 파일 시스템에서"

편집 2: 내가 찾은 내용에 관심이 있는 사람이 있으면 stackoverflow에서 편집 내용을 복사하여 붙여넣기도 합니다.

다양한 이동 방법 간의 속도 차이를 테스트하기 위해 스크립트를 작성했습니다. 먼저 1x5GB( dd if=/dev/urandom of=/mnt/storage/source/test.file bs=100M count=50)를 생성한 다음 100x5MB( for i in {1..100}; do dd if=/dev/urandom of=/mnt/storage/source/file$i bs=1M count=5), 마지막으로 10000x5kB( for i in {1..100000}; do dd if=/dev/urandom of=/mnt/storage/source/file$i bs=1k count=5) 를 생성합니다.

from shutil import move
from os import rename
from datetime import datetime
import subprocess
import os

print("Subprocess mv: for every file in directory..")
s = datetime.now()
for f in os.listdir("/mnt/storage/source/"):
    try:
        subprocess.call(["mv /mnt/storage/source/"+str(f)+" /mnt/storage/mv"],shell=True)
    except Exception as e:
        print(str(e))
e = datetime.now()
print("took {}".format(e-s)+"\n")

print("Subprocessmv : directory/*..")
s = datetime.now()
try:
    subprocess.call(["mv /mnt/storage/mv/* /mnt/storage/mvf"],shell=True)
except Exception as e:
    print(str(e))
e = datetime.now()
print("took {}".format(e-s)+"\n")


print("shutil.move: for every file file in directory..")
s = datetime.now()
for f in os.listdir("/mnt/storage/mvf/"):
    try:    
        move("/mnt/storage/mvf/"+str(f),"/mnt/storage/move")
    except Exception as e:
        print(str(e))
e = datetime.now()
print("took {}".format(e-s)+"\n")

print("os.rename: for every file in directory..")
s = datetime.now()
for f in os.listdir("/mnt/storage/move/"):
    try:
        rename("/mnt/storage/move/"+str(f),"/mnt/storage/rename/"+str(f))
    except Exception as e:
        print(str(e))
e = datetime.now()
print("took {}".format(e-s)+"\n")


if os.path.isdir("/mnt/storage/rename_new"):
    rmtree('/mnt/storage/rename_new')
print("os.rename & os.mkdir: rename source dir to destination & make new source dir..")
s = datetime.now()
rename("/mnt/storage/rename/","/mnt/storage/rename_new")
os.mkdir("/mnt/storage/rename/")
e = datetime.now()
print("took {}".format(e-s)+"\n")

이는 큰 차이가 없음을 보여줍니다. 5GB 파일은 매우 빠르게 이동했는데, 이는 파일 테이블을 변경하여 이동하는 것이 효과적임을 알려줍니다. 다음은 10000*5kB 파일에 대한 결과입니다(현재 네트워크 작업 부하에 따라 결과가 달라지는 것처럼 느껴집니다. 예를 들어 첫 번째 mv테스트에는 2m 28s가 걸렸고 나중에는 동일한 파일을 사용하여 3m 22s가 걸렸으며 os.rename()대부분의 경우 가장 빠른 방법이기도 합니다. .):

Subprocess mv: for every file in directory..
took 0:02:47.665174

Subprocessmv : directory/*..
took 0:01:40.087872

shutil.move: for every file file in directory..
took 0:01:48.454184

os.rename: for every file in directory..
rename took 0:02:05.597933

os.rename & os.mkdir: rename source dir to destination & make new source dir..
took 0:00:00.005704

관련 정보