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


248

在bash中,我需要这样做:

  1. 将所有文件放在目录中

  2. 将它们复制到现有目录

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


11
为什么关闭了?bash命令是内置命令还是外部命令(例如,大多数系统上都存在printf)是任意的,因此cp问题可以被视为bash问题,这是一种编程语言。我从未见过关于关闭文件复制的Python问题。
西罗Santilli郝海东冠状病六四事件法轮功2014年


我是在寻找有关Bash shell复制命令语法的提醒的,我很高兴地报告这些命令似乎也可以在Windows安装的基础NTFS文件系统上使用。
David A. Gray

Answers:


395

您想要的是:

cp -R t1/. t2/

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


2
我真的很喜欢这种语法,但是由于某种原因,它无法使用mv。有人知道为什么吗?
Martin von Wittich

2
惊人。这在哪里记录?是POSIX还是扩展名?
西罗Santilli郝海东冠状病六四事件法轮功2014年

9
@CiroSantilli六四事件法轮功包卓轩如果复制目录,则cp将创建一个目录并将所有文件复制到该目录中。如果您使用名为“。”的假装文件夹,该文件夹与保存该文件夹的目录相同,则副本的行为是这样的。假设t1包含一个名为“ file”的文件。cp将执行相当于“ cp t1 /./ file t2 /./”的操作。它正在复制文件夹“。”,但是将文件复制到t2的“。”中。文件夹删除“ ./”,因为“ t2 /./”与“ t2 /”相同。从技术上讲,这意味着它是POSIX内置的行为……但可能与您期望的不一样!
醒目


32
cp dir1/* dir2

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

cp -r dir1/* dir2

3
如果要捕获隐藏文件,则可能需要使用“ dir1 / * dir1 /.*”而不是“ dir1 / *”,这取决于外壳的配置方式。
ssokolow

2
复制dir1/.*不是一个好主意,因为它会复制dir1 / ..(即您实际上要复制的目录的父目录)。它还复制dir1 /。很好,除了已经(大部分)已经被复制,所以您要进行两次工作。
戈登·戴维森

1
您可以dir1/.*通过cd-进入要复制的目录,然后将其称为来解决/ hidden files问题.。因此,如果要将所有文件(包括隐藏文件)从一个目录复制到现有目录,则可以:cd [source dir]cp . [path to destination dir, with no trailing slash]
RobW 2012年

8

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

sudo cp -R t1/* t2/

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

sudo cp -R t1/* ./

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

sudo cp -R ./* t2/

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


2
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的可读版本)
zpon

2

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

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

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

额外的麻烦是处理相对或绝对目标。

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


1

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

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

请注意folder1后面的点(。),以获取folder1内的所有内容

cp -r $(pwd)/folder1/. $(pwd)/folder2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.