复制【cp的使用】问题

Pau*_*son 5 bash cp gnome-shell

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

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

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

Mic*_*mer 9

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

您可以通过运行来看到这种情况,例如:

echo /mnt/1804iso/.*
Run Code Online (Sandbox Code Playgroud)

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

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

.hidden
xyz
data/
data/...
1804iso/.hidden
1804iso/xyz
...
Run Code Online (Sandbox Code Playgroud)

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

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


对于您真正想做的事情,我建议改用rsync

rsync -avx /mnt/1804iso/ /media/benny/0EB4-95E2/
Run Code Online (Sandbox Code Playgroud)

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


Kus*_*nda 3

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

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

rsync -ai /mnt/1804iso/ /media/benny/0EB4-95E2
Run Code Online (Sandbox Code Playgroud)

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

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

cp -Rn /mnt/1804iso/* /media/benny/0EB4-95E2/
Run Code Online (Sandbox Code Playgroud)