复制[使用cp]问题

复制[使用cp]问题

我安装了几个子文件夹/mnt。一是/mnt/数据,另一个是/mnt/1804iso。这/数据包括从另一个磁盘安装的数据文件夹和文件,以及/1804iso包括一个已安装的 ISO 文件,我想将其内容复制到文件夹中/媒体/班尼/0EB4-95E2/这是一个已安装的闪存驱动器。

于是我打开了巴什并输入sudo cp -Rn /mnt/1804iso/.* /media/benny/0EB4-95E2/。我通常会省略通配符星号之前的句点/*/,但如果我这样做,ISO 中的隐藏文件就不会被复制。所以用这个命令发生了一件奇怪的事情。正确复制ISO文件后,就开始复制了/mnt/数据文件夹和文件也是如此。我不明白为什么会发生这种情况,因为没有引用该文件夹,除非我对命令部分的理解/mnt/1804iso/.*完全有缺陷。

有人可以解释一下为什么我的/mnt/data文件夹被包含在复制中吗?

答案1

.*将扩展到您的隐藏文件、....这是 Bash 的一个不幸的部分文件名扩展有效:有一个名为 的目录条目..,它由一个首字母.和其后的任意数量的字符组成,因此它与 匹配.*并被包含。

你可以通过运行来看到这种情况的发生,例如:

echo /mnt/1804iso/.*

其中将列出/mnt/1804iso/./mnt/1804iso/..与其余部分一起列出。

../data是你的data目录。您最终将在目标中得到如下目录结构:

.hidden
xyz
data/
data/...
1804iso/.hidden
1804iso/xyz
...

也就是说,你实际上最终会得到您想要复制的所有内容的副本,以及所有您不想复制的内容。如果您使用,cp -Rnv您将看到它正在复制什么以及复制到哪里。

其他一些 shell 对此会更好。在 zsh 中,它会更接近你想要的:仅有的隐藏文件将被复制。在 Bash 中,您可以cp src/.[^.]* dest使用几乎匹配 zsh 行为,并列出两个源位置。或者,您可以shopt -s dotglob提前运行,然后src/*将扩展为包括点文件,但是排除.和条目..(但这可能会导致你以后做一些你不想做的事情,所以要小心)。


对于您真正想做的事情,我建议使用同步反而:

rsync -avx /mnt/1804iso/ /media/benny/0EB4-95E2/

这将复制内容1804iso目的地的目录(注意最后的斜杠!),包括任何隐藏文件。

答案2

该模式/mnt/1804iso/.*可能扩展到目录条目/mnt/1804iso/..,它与 相同/mnt。我猜测这就是它开始复制的原因/mnt/data

在这种情况下,我只会使用rsync

rsync -ai /mnt/1804iso/ /media/benny/0EB4-95E2

这会将所有/mnt/1804iso,包括隐藏文件复制到/media/benny/0EB4-95E2./省略源目录末尾的 将会在目标目录下创建一个目录1804iso

或者,启用withdotglob中的 shell 选项来匹配隐藏名称和非隐藏名称(但不匹配或)。然后使用bashshopt -s dotglob*...

cp -Rn /mnt/1804iso/* /media/benny/0EB4-95E2/

相关内容