Skip to main content

回收站

JuiceFS 提供回收站功能,所有被删除的文件将会在其中保存一段时间(这些文件仍参与计费)。用户可以登录 JuiceFS 控制台,通过其中的回收站标签页删除或恢复其中的文件。

信息

回收站的作用不仅仅是保护误删的文件,事实上,所有的数据修改都受到回收站的保护,包括文件的覆盖写。阅读回收站和文件碎片了解更多。

用户创建文件系统时,回收站功能默认开启。保存时限免费版为 1 天,专业版为 7 天。用户可以登录 JuiceFS 控制台,在设置标签页修改过期时间。

将文件移入回收站

在 shell 里执行 rm 命令,目标文件就会被移入回收站。但如果要删除大量文件,我们推荐使用 juicefs rmr,该命令直接从元数据服务操纵元数据,绕过 POSIX API,速度更快。

移入回收站后,文件不再被原目录所包含,但文件内容仍然保存在对象存储中。如果被删除的文件与回收站中已有的项目路径相同,则会在回收站中同时保存多个版本。

请注意以下几种情况不在上述范围内:

  • 回收站只对文件有效,目录会被立即删除。恢复文件的时候会连带恢复原始目录结构,但无法保持先前的目录属性。特别的,如果被删除的是空目录将无法恢复。
  • 回收站对 juicefs snapshot -d <path> 无效,快照将被立即删除,不会进入回收站,但执行 rm <path> 时,快照会进入回收站。
  • 回收站对 juicefs import 创建的目标无效,被导入的对象对应的元数据将立即被删除,用户对象存储中的内容不受影响。

清空回收站

回收站的文件仍参与 JuiceFS 以及你所使用的对象存储的计费,因此若有需要,可以登录控制台,在回收站标签页中将回收站中的文件彻底删除。

从回收站删除文件后,元数据会从元数据服务上标记删除,从而不再参与 JuiceFS 计费。但请注意,对象存储上的文件块,永远会按照删除文件时刻的回收站保留时间来安排删除,不会因为清空回收站而受影响。即便你在清空回收站以后,再去修改回收站保留时长,也并不影响先前删除的文件在对象存储上的清理计划。而在私有部署中,回收站的行为可以进行更全面的定制,有专门的手段来紧急清空回收站、释放对象存储空间,详询 Juicedata 团队。

彻底删除以后,对象存储数据块并不会严格按照过期时间来删除,而是以「后台任务」的形式分发给各个客户端执行,因此对象存储数据未必会及时清理。为了确保回收站功能正常运行,文件系统必须保持至少一个 JuiceFS 客户端挂载(并且不能禁用后台任务)。无论是 FUSE,还是 Hadoop Java SDK,亦或是 S3 网关,这些客户端在该方面均以类似的机制工作,如果你的文件系统完全没有任何客户端挂载运行,那么回收站中的文件将无法正确过期和释放。

从回收站恢复

用户可以登录 JuiceFS 控制台,将回收站中的文件恢复到原路径:

  1. 切换标签页到回收站
  2. 选择需要恢复的文件
  3. 点击「恢复」按钮,或者如果是需要恢复所有文件,则直接点击「恢复所有」

如果误删了大目录,待恢复的文件数太多,控制台操作不便,你也可以在挂载点根目录下的 .trash 文件夹直接操作。假设 JuiceFS 挂载点为 /jfs,参考下方示范。

提示

在回收站下 ls,会注意到输出格式与普通目录不同,格式类似:

'66637676|dir1|dir2|file.txt'

这里的管道符号 | 仅仅是一种展示优化,代表目录结果,用下方示范的 `mv`` 进行恢复操作以后,将会保持原本的文件名。

也正是由于管道符号的存在,操作回收站里的文件时,需要加上单引号,否则管道符号会被 shell 进行错误解读,让命令无法正确执行。

# 如果报错提示没有 .trash 目录,请升级客户端并重新挂载
cd /jfs

ls .trash

# 从回收站的所有文件中找出完整路径包含 xxx 的所有文件
ls '.trash/xxx'

# 从回收站中恢复所有路径包含 xxx 的文件
mv '.trash/xxx' .

# 恢复包含 tar.gz 的所有文件
mv '.trash/tar.gz' .

如果需要根据更复杂的规则进行过滤恢复,可以使用 find 命令:

# 回收站内文件,ctime(change time)代表删除时间,因此可以根据删除时间范围来筛选。
# 以下命令表示恢复所有 ctime 大于 2023-12-12 17:30:00 及小于 2023-12-13 23:00:00 的文件
find .trash -newerct "2023-12-12 17:30:00" ! -newerct "2023-12-13 23:00:00" -exec mv {} . \;

# 恢复所有 tar.gz 文件
find .trash -name '*.tar.gz' -exec mv {} . \;

# 恢复 mydir 下所有的 tar.gz 文件
find .trash -name '*|mydir|*.tar.gz' -exec mv {} . \;

# 恢复所有名为 mydir 的目录
find .trash -wholename '*|mydir|*' -exec mv {} . \;

# 恢复 mydir/text.txt
find .trash -wholename '*|mydir|text.txt' -exec mv {} . \;

需要注意:

  • 使用命令行恢复大量文件时(超过 10 万),可能会遗漏部分文件,建议优先使用控制台进行恢复操作,如果必须使用命令行进行大量文件恢复操作,需要将过滤条件写好以后(如上方命令示范),反复执行,来确保没有遗漏。
  • 如果文件所在的目录不存在,将会以 root 用户身份自动逐级创建(类似于 sudo mkdir -p 的效果)。请注意自动创建的目录的所有者和访问权限可能会与原目录不一致,需手动调整。
  • 如果文件系统中已存在相同路径的文件或目录,那么恢复的文件名后会加一个整数序号消除冲突,比如 /a/b/c.txt 会恢复成 /a/b/c.txt-1
  • 如果在回收站中同时选中多个文件,将会按列表顺序依次尝试恢复,路径冲突的项目会被跳过。