我想将D:\
包含所有数据的分区从 NTFS 转换为 ext4,互联网告诉我应该执行以下操作:
- 将所有分区缩小到最小大小
- 备份我的数据(通过克隆 GParted 中的分区完成)
- 将分区格式化为 ext4(尚未完成,但也不是那么难)
- 将备份复制到驱动器
- 删除备份并增加所有分区
我不知道如何完成第 4 部分。我真的可以像复制文件夹一样复制整个驱动器吗?是否有专门的工具可以做到这一点?如何确保不会错过系统隐藏的任何文件夹或符号链接等?如果这很重要,我有一个 Ubuntu Live USB 棒可以使用。
答案1
1. FreeFileSync GUI 工具(Windows、Mac、Linux)
为了确保你不会错过任何数据,我强烈建议使用像免费文件同步。它是图形化的、免费的、开源的、跨平台的(Windows、Mac、Linux)。只要确保不要搞砸了,不要复制回去,删除所有内容!不过,这并不难,因为它是图形化的,而且非常用户友好。
只需设置文件夹即可来源在左边和目的地,然后点击右上角的齿轮并选择“镜像”选项以从左到右镜像,然后按左上角的“比较”按钮。一旦确定需要复制的内容,它将弹出一个信息屏幕,显示它将要做什么(它将创建、覆盖或删除多少个文件等)。确保垃圾桶旁边没有任何东西(表示要删除的内容),或者您看到预期的要删除的文件,用垃圾桶和减号标记,然后按“同步”按钮开始。瞧!易于使用。以下是屏幕截图:
2. rsync 命令行工具(Linux、带有 Cygwin 的 Windows)(又名:“如何使用 rsync”):
如果你正在从 Linux 进行复制,你当然也可以使用 FreeFileSync,但如果你是命令行专家,你可能会喜欢rsync
更好。它是一种纯命令行工具,使用起来更困难,但仍然非常强大,尽管不如 FreeFileSync 强大,因为它不能很好地处理双向同步。以下是我最喜欢的几个rsync
命令:
从源复制到目标,保留目标中不冲突的任何内容:
sudo rsync -rah --stats --info=progress2 '/path/to/source' '/path/to/destination'
或者,添加
--verbose
,或者仅添加-v
(或者-rahv
在我的情况下)也可以获得将要复制的内容的完整列表。可选地,添加
--dry-run
以显示什么会发生了但实际上尚未发生。或者,您也可以将要复制的整个文件列表记录到
stdout.log
这样的文件中,并将任何错误记录到stderr.log
这样的文件中。在这里,我通过删除来删除进度指示器--info=progress2
,这样日志文件就不会到处都是进度信息:(sudo rsync -rah --verbose --dry-run --stats '/path/to/source' '/path/to/destination' | tee -a '/path/to/stdout.log') 3>&1 1>&2 2>&3 | tee -a '/path/to/stderr.log'
--dry-run
准备实际复印时,请从上面删除。请务必查看打印出来的统计段落(因为您有--stats
),位于标准输出日志在实际运行脚本之前,请检查文件,以确保一切看起来都很好。以下是执行 MIRROR 选项后获得的输出示例
--stats
。请注意,它正在删除一些文件。请特别注意这一点,因为删除文件是无法撤消的(至少没有特殊的软件恢复工具)。只需记住它是永久删除它们,不要将它们发送到某种回收站或其他地方,所以要小心!文件数:102,033 (reg:89,638,dir:9,867,链接:2,502,特殊:26)
创建的文件数:3 (reg:3)
删除的文件数:9,861 (reg:9,360,dir:474,链接:27)
传输的常规文件数:25
文件总大小:8.12G 字节
传输的文件总大小:35.30M 字节
文字数据:35.30M 字节
匹配的数据:0 字节
文件列表大小:917.43K
文件列表生成时间:0.007 秒
文件列表传输时间:0.000 秒
发送的总字节数:38.33M
接收的总字节数:1.02M发送 38.33M 字节 接收 1.02M 字节 7.15M 字节/秒
总大小为 8.12G 加速比为 206.37从源镜像到目标,这也意味着删除目的地中的任何事物不在源(请注意上面显示的统计输出中的“已删除文件数”行),添加
--delete --delete-excluded
(即使我们还没有排除任何内容,一旦你了解了语法,--exclude=PATTERN
你就会意识到你想要这个--delete-excluded
标志)。首先,安全的试运行版本:
(sudo rsync -rah --verbose --dry-run --stats --delete --delete-excluded '/path/to/source' '/path/to/destination' | tee -a '/path/to/stdout.log') 3>&1 1>&2 2>&3 | tee -a '/path/to/stderr.log'
现在危险 危险 危险——如果你反向执行源和目标,可能会删除所有内容版本(因此在继续之前请检查 stdout.log 末尾的统计输出):
(sudo rsync -rah --verbose --stats --delete --delete-excluded '/path/to/source' '/path/to/destination' | tee -a '/path/to/stdout.log') 3>&1 1>&2 2>&3 | tee -a '/path/to/stderr.log'
现在的版本不会保存任何日志文件,以防你想查看实时进度并在末尾有统计段落,但是在 stdout.log 中没有复制或删除的单个文件的日志,也没有在 stderr.log 中打印错误:
sudo rsync -rah --info=progress2 --stats --delete --delete-excluded '/path/to/source' '/path/to/destination'
这只是 rsync 的开始。请阅读手册:
man rsync
,或在线阅读:https://linux.die.net/man/1/rsync,请记住,你可以混合搭配我上面展示的许多选项。其他真正有用的事情包括设置源文件.txt文件,以及排除.txtfile,分别用于包含和排除文件和路径列表。分别使用选项--files-from='/path/to/source.txt'
和执行此--exclude-from='/path/to/exclude.txt'
操作。这非常有用。最后,这与选项配合得很好--relative
。最后,完整的 Bash 脚本可能看起来像这样:(sudo rsync $OPTIONS $SRC $DEST | tee -a $LOG_STDOUT) 3>&1 1>&2 2>&3 | tee -a $LOG_STDERR
...
$SRC
您的源路径在哪里(在本例中为相对的所有文件的路径源文件.txt文件(例如简单地/
使所有内容相对于您的根目录),$DEST
是您的目标路径,$LOG_STDOUT
是您想要记录 stdout 信息的路径,$LOG_STDERR
是您想要记录 stderr 信息的路径,$OPTIONS
可能看起来像这样:-rah --verbose --stats --relative --info=progress2 --delete --delete-excluded --dry-run --files-from='/path/to/source.txt' --exclude-from='/path/to/exclude.txt'
当然,如上所述,您可能希望根据需要删除
--verbose
、、、和、和,具体取决于您正在执行的操作--relative
。--info=progress2
--delete
--delete-excluded
--dry-run
重要提示:对于 exFAT 和 FAT 文件系统,您想要使用rsync
...
另请参阅我的回答:在 FAT 和 exFAT 文件系统中使用 rsync 的最佳设置