ChatGPT解决这个技术问题 Extra ChatGPT

将文件从一个目录复制到现有目录

在 bash 我需要这样做:

将目录中的所有文件复制到现有目录中

我该怎么做呢?我尝试了 cp -r t1 t2(t1 和 t2 都是现有目录,t1 中有文件)但它在 t2 中创建了一个名为 t1 的目录,我不希望这样,我需要 t1 中的文件直接进入 t2。我该怎么做呢?

为什么关闭? bash 命令是内置命令还是外部命令是任意的(例如 printf 在大多数系统上都存在),因此 cp 问题很可能被视为 bash 问题,它是一种编程语言。我从来没有见过一个关于文件复制的 Python 问题被关闭。
我来到这里是为了寻找有关 Bash shell 复制命令语法的提示,我很高兴地报告这些命令似乎也适用于我的 Windows 安装上的底层 NTFS 文件系统。

D
Doguhan Uluca

你想要的是:

cp -R t1/. t2/

最后的点告诉它复制当前目录的内容,而不是目录本身。此方法还包括隐藏文件和文件夹。


我真的很喜欢这种语法,但由于某种原因它不适用于 mv。有谁知道为什么?
惊人。这是在哪里记录的?它是 POSIX 还是扩展?
@CiroSantilli六四事件法轮功包卓轩如果你复制一个目录,cp会创建一个目录并将所有文件复制到其中。如果您使用名为“.”的假文件夹,它与保存它的目录相同,则副本会以这种方式运行。假设 t1 包含一个名为“file”的文件。 cp 将执行等同于“cp t1/./file t2/./”的操作。它正在复制文件夹“。”,但将文件复制到 t2 的“。”文件夹去除“./”,因为“t2/./”与“t2/”相同。从技术上讲,这意味着它是 POSIX 内置行为……但可能不是您所期望的方式!
B
Bertrand Marron
cp dir1/* dir2

或者,如果您在 dir1 中也有想要复制的目录

cp -r dir1/* dir2

根据您的 shell 的配置方式,如果您还想捕获隐藏文件,您可能需要使用“dir1/* dir1/.*”而不是“dir1/*”。
复制 dir1/.* 不是一个好主意,因为它复制了 dir1/..(即您实际尝试复制的目录的父目录)。它还复制 dir1/。这很好,除了它已经(大部分)被复制了,所以你做了两次工作。
您可以通过 cd-ing 进入要从中复制的目录,然后将其称为 . 来解决 dir1/.*/hidden files 问题。因此,如果您想将包括隐藏文件在内的所有文件从目录复制到现有目录,您可以:cd [source dir]cp . [path to destination dir, with no trailing slash]
K
Karl Giesing

如果要将某个目录中的某些内容复制到当前目录中,请执行以下操作:

cp dir1/* .

这假设您没有尝试复制隐藏文件。


大量文件也失败(因为'*'不能扩展到无限多个文件..)y
K
Konkret

假设 t1 是其中包含文件的文件夹,而 t2 是空目录。你想要的是这样的:

sudo cp -R t1/* t2/

请记住,对于第一个示例,t1 和 t2 必须是完整路径或相对路径(基于您所在的位置)。如果需要,您可以导航到空文件夹 (t2) 并执行以下操作:

sudo cp -R t1/* ./

或者您可以导航到包含文件 (t1) 的文件夹并执行以下操作:

sudo cp -R ./* t2/

注意:* 符号(或通配符)代表所有文件和文件夹。 -R 标志表示递归(所有内容中的所有内容)。


B
Bidyashish Kumar

对于某个目录内,这将使用完整的,因为它将所有内容从“folder1”复制到某个目录内的新目录“folder2”。

$(pwd) 将获取当前目录的路径。

注意文件夹 1 后的点 (.) 以获取文件夹 1 中的所有内容

cp -r $(pwd)/folder1/. $(pwd)/folder2

G
Gordon Davisson
cp -R t1/ t2

源目录上的尾部斜杠稍微改变了语义,因此它复制了内容而不是目录本身。它还避免了 Bertrand 的答案所具有的通配和不可见文件的问题(复制 t1/* 会丢失不可见文件,复制 `t1/* t1/.*' 复制 t1/. 和 t1/..,这是您不想要的) .


您的解决方案不起作用,至少在我的安装中不起作用(ubuntu 12.10)$ mkdir t1 $ mkdir t2 $ touch t1/one $ touch t1/two $ touch t1/.three $ cp -R t1/ t2 $ ls t2/ t1(对不起,评论中没有代码格式,可读版本在pastebin.com/yszSxV6G)
谢谢你的详细解释!
K
Kai - Kazuya Ito

2021 年 11 月更新:

带有标志“-R”的代码将“folder1”的所有内容完美地复制到现有的“folder2”:

cp -R folder1/. folder2

标志“-R”也复制符号链接,但标志“-r”跳过符号链接,因此标志“-R”优于标志“-r”。

最新的 GNU Grep 3.7:

-R, --dereference-recursive

For each directory operand, read and process all files in that directory, 
recursively, following all symbolic links.
-r, --recursive

For each directory operand, read and process all files in that directory, 
recursively. Follow symbolic links on the command line, but skip symlinks 
that are encountered recursively. Note that if no file operand is given, 
grep searches the working directory. This is the same as the 
‘--directories=recurse’ option.

J
Jim Dennis

根据一些细节,您可能需要执行以下操作:

r=$(pwd)
case "$TARG" in
    /*) p=$r;;
    *) p="";;
    esac
cd "$SRC" && cp -r . "$p/$TARG"
cd "$r"

...这基本上会更改为 SRC 目录并将其复制到目标,然后返回到您开始的位置。

额外的大惊小怪是处理相对或绝对目标。

(这不依赖于 cp 命令本身的微妙语义......关于它如何处理带有或不带尾随 / 的源规范......因为我不确定它们是否稳定、便携和可靠,不仅仅是GNU cp,我不知道他们将来是否会继续如此)。


y
yuanjianpeng

正确的选项应该是 -T。与 -r 一起使用以递归复制。

$ cp -r -T t1 t2