复制文件而不丢失文件/文件夹权限

如何在使用 ext4 文件系统的 Ubuntu 计算机之间,通过一个使用 vfat 文件系统的 USB 设备,复制文件/文件夹而不丢失文件权限?
我尝试了从源计算机使用基本的 Ctrl+C 复制,然后 Ctrl+V 到 USB 设备,再从 USB 设备使用 Ctrl+C,最后 Ctrl+V 到目标计算机,但是文件/文件夹的权限都无法保持不变。

vfat不支持Unix文件系统权限。如果您想保留它们,您需要将它们存储在tarball或类似的文件中。 - Alex L.
为什么不使用我建议的rsync呢? - SiddharthaRT
3个回答

你可以将源代码制作成一个tar归档文件,然后通过USB驱动器将其复制到另一台计算机上,并在那里进行解压。Tar会保留文件权限。
1 - 在源计算机上:
cd /path/to/folder/to/copy
tar cvpzf put_your_name_here.tar.gz .

2 - 将put_your_name_here.tar.gz复制到USB驱动器,然后再复制到另一台计算机上。
3 - 在目标计算机上:
cd /path/to/destination/folder
tar xpvzf put_your_name_here.tar.gz

tar将以完整的权限重新创建存档文件夹结构。

这些命令将对源文件夹的内容进行归档,然后将其提取到目标文件夹中。如果您想要复制文件夹本身,则应在第一步执行以下操作:

cd /path/to/parent/folder
tar cvpzf put_your_name_here.tar.gz folder_to_copy

同样的机制可以用于单个文件。

如果你可以使用ssh从一台计算机连接到另一台计算机,@siddharthart的答案(rsync)可能更实用。


不要忘记在使用tar命令时加上-p选项,以确保权限得到保留。 - haziz
@haziz 实际上,-p 标志并不是必需的,请参阅我对 @mikewhatever 答案的评论。当解压缩时,-z 也不是必要的,因为 tar 能够自行确定压缩类型,除非它是旧版本。在命令中包含标志不会有任何影响。 - sierrasdetandil
4我不认为你可以指望这种行为。顺便引用一下man tar页面上的内容:“-p,--preserve-permissions,--same-permissions提取有关文件权限的信息(超级用户的默认设置)”,这似乎只是在tar作为超级用户调用时的默认行为。不要指望这是默认行为。当压缩或解压缩时,我也会始终明确地指出-z标志(或者如果使用bzip2,则是-j)。 - haziz
能够轻松地添加基本加密吗?(我猜应该有很多种方法可以做到,但我想知道,如果通过命令行完成,密码/加密密钥/口令应该如何提供?像这样********还是像sudo密码那样,不显示任何按键?) - nutty about natty
tar遇到了一个非常严重的问题 - 它无法处理超过100个字符的路径。 - Nathan Osman
@nuttyaboutnatty 只需使用gnupg将其加密给自己即可 ;-). - binki
@NathanOsman 据我所知,GNU tar在路径长度上没有任何限制。 - Timothy Zorn
您可能需要超级用户特权来保留所有权。 - kojow7

你可以尝试使用带有-a标志的rsync来保持所有权限的复制。我不知道是否有更简单的解决方案,但我过去曾经用它来达到某个目的。
Rsync在重复复制、更新文件夹等方面提供了出色的支持,同时速度非常快。

6我确实喜欢rsync(事实上,我很爱它 :-]),但如果目标设备格式为vfat,就会丢失ext4文件权限,就像oshirowanen所描述的那样。在这种情况下,使用tar解决方案更好。 - yuric

我认为对文件和目录进行打包和解压缩应该都可以正常工作。
打包命令:
tar cvpfz /target.tar.gz /source/

解压缩:
tar xvpfz /source/

p”标志代表“--preserve-permissions”。

有关更多信息,请参阅man tar


我刚刚做了一个快速测试,以确保不需要使用“-p”选项——tar默认情况下会保留权限,至少在用户拥有被归档/提取的文件时是这样的。 - sierrasdetandil
2没错,但是你没有告诉我们你想要复制哪些文件,而且我也没有理由自己去假设。 - mikewhatever