我安装了几个子文件夹/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 选项来匹配隐藏名称和非隐藏名称(但不匹配或)。然后使用bash
shopt -s dotglob
*
.
..
cp -Rn /mnt/1804iso/* /media/benny/0EB4-95E2/