【问题标题】:Move all files from one directory to another with limited disk space将所有文件从一个目录移动到另一个磁盘空间有限的目录
【发布时间】:2020-06-17 18:30:23
【问题描述】:

我有一个包含几个大文件的挂载目录。我想将这些文件移动到本地目录。但是,本地计算机的磁盘空间非常有限,我遇到了一个问题,即移动这些文件由于磁盘空间而失败并随后丢失。我正在寻找一种pythonic方式:

  1. 尝试将所有文​​件从源目录移动到目标目录
  2. 如果空间不足,请将它们全部移回并引发错误(或仅返回 false)而不更改所有权或权限

我不想移动目录本身,只移动它的内容。覆盖现有文件是可以的。我看到很多“我如何移动文件”的问题,但没有看到“如果空间不足会发生什么”的问题。

本地机器运行 Centos 7,远程机器运行 Solaris 10。

【问题讨论】:

  • 最简单的解决方案是尝试将每个文件复制到目的地;如果空间不足,请尝试下一个文件;如果不这样做,请删除原始文件并处理下一个文件。
  • 如果空间不足会怎样?
  • 你使用什么系统?听起来有点像 Windows 错误。如果您需要快速解决方案,Rclone 无论如何都具有该功能。无论如何,一个最小的可执行示例将不胜感激;9
  • @MichaelBianconi,如果您的空间不足,那么您当然无法继续。但至少不会丢失任何数据。
  • @4A61636B20486973746F 本地操作系统是 Centos,远程操作系统是 Solaris 10

标签: python centos7 solaris-10


【解决方案1】:

我认为最 Pythonic 的方法是逐块移动,检查两者之间的错误。 我将假设该文件太大而无法一次完全存储在内存中,所以这样的事情可能是最好的:

chunk_size = 2048
successful = True

with f_in = open("original.file","rb"):
  chunk = f_in.read(chunk_size)#Only reads a small chunk of the old file at a time
  while chunk:
    try
      f_out = open("new_file","ab+")
      f_out.write(chunk) #Writes the small chunk to the end of the new file and 
      f_out.close()      #then closes it so as not to run out of memory
      chunk = f_in.read(chunk_size)
    except OSError as e:
      chunk = False
      successful = False
if successful:
  os.remove("original.file")

我相当肯定这对您有用,因为您会在出现 NOSPC 错误时提前结束,这意味着您的磁盘空间已用完。只有在您完成写入后才会删除原始文件(我假设这是您的意图,因为您想移动它,而不是复制它)。

使用 os.rename("old/path/file.txt","new/path/file.txt") 重命名文件有一个更简单的解决方案,但我不能 100% 确定它是否适用于安装光盘到本地光盘。但这可能值得一试。

【讨论】:

  • 如果我需要将文件移回,这将改变文件所有权
  • 说得好,我忘了。 os.rename 解决方案不会,但如果有效。
猜你喜欢
  • 1970-01-01
  • 2017-06-09
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
相关资源
最近更新 更多