我想将目录 1 的内容复制到目录 2。但是,我只想从目录 1 中复制文件(而不是目录)。我该怎么做?
cp dir1/* dir2/*
Run Code Online (Sandbox Code Playgroud)
那么我仍然有目录问题。
此外,我所有的文件都没有任何扩展名,所以. 不会做的伎俩
Ada*_*hon 23
cp dir1/* dir2
Run Code Online (Sandbox Code Playgroud)
cp除非明确告知,否则不会复制目录(--recursive例如,参见man cp)。
注 1: cp很可能会以非零状态退出,但无论如何文件都会被复制。基于退出代码链接命令时,这可能是一个问题:&&,||,if cp -r dir1/* dir2; then ...等(感谢contrebis为他们在这个问题上的评论)
注 2:cp期望最后一个参数是单个文件名或目录。*目标目录的名称后确实不应该有通配符。dir2\*将像dir1\*. 意想不到的事情会发生:
dir2为空,取决于您的外壳和设置:
dir2/*将按字面理解(查找名为 的文件/目录*),这也可能导致错误,除非*确实存在。dir2/*它将完全从命令中删除,而将cp dir1/*. 其中,根据 的扩展dir1/*,甚至可能破坏数据:
dir1/*只匹配一个文件或目录,您将收到来自cp.dir1/*正好匹配两个文件,一个将被另一个 ( Bad )覆盖。dir/*匹配多个文件并且最后一个匹配是a,您将收到错误消息。dir/*是一个目录,则所有其他匹配项都将移动到该目录中。dir2不为空,则再次取决于:
dir2/*是一个目录,dir1/*则其他匹配的dir2/*将被移入。dir2/*是一个文件,您可能会收到一条错误消息,除非 dir1/*只匹配一个文件。Gil*_*il' 10
扩展通配符的是shell,而不是命令。所以cp dir1/* dir2/*首先扩展两个通配符,然后调用cp结果。这完全不是您所期望的:根据 中已有的文件数量dir2,dir2/*可能会扩展为一个或多个参数。该命令cp不知道哪些参数来自扩展第一个模式,哪些来自扩展第二个模式。它期望它的最后一个参数是目标目录的名称。因此,要将目录中的所有文件复制dir1到目录中dir2,最后一个参数必须是目录dir2:
cp dir1/* dir2
Run Code Online (Sandbox Code Playgroud)
由于*匹配所有文件,cp尝试复制所有文件。这包括目录:目录也是文件。它跳过目录,但报告错误。它复制特殊文件的内容,例如命名管道(最好向它们写入内容,否则cp会阻塞)等。
要仅复制常规文件,您需要限制匹配。在 zsh 中,您可以使用glob 限定符 .:
cp dir1/*(.) dir2
Run Code Online (Sandbox Code Playgroud)
其他贝壳没有这个。您可以使用该find命令过滤文件类型。假设您运行的是非嵌入式 Linux 或 Cygwin:
find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +
Run Code Online (Sandbox Code Playgroud)
在 Linux、FreeBSD 和 OSX 上:
find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2
Run Code Online (Sandbox Code Playgroud)