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

在bash中,我需要这样做:

  1. 取一个目录中的所有文件

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

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

362188 次浏览
cp dir1/* dir2

或者如果dir1中有目录,也想复制

cp -r dir1/* dir2
cp -R t1/ t2

源目录上的尾随斜杠稍微改变了语义,因此它复制了内容,但不复制目录本身。它还避免了通配符和不可见文件的问题,Bertrand的答案(复制t1/*会遗漏不可见文件,复制' t1/* t1/。*'复制t1/。和t1 / . .这是你不想要的)。

根据一些细节,你可能需要这样做:

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

... 这基本上改变到SRC目录,并将其复制到目标,然后返回到你开始的地方。

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

(这并不依赖于cp命令本身的微妙语义…关于它如何处理带有或没有结尾/…因为我不确定它们除了GNU cp之外是否稳定、可移植和可靠,我不知道它们在未来是否会继续如此)。

你想要的是:

cp -R t1/. t2/

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

如果你想从一个目录复制一些东西到当前的目录,这样做:

cp dir1/* .

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

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

sudo cp -R t1/* t2/

请记住,对于第一个例子,t1和t2必须是完整路径,或相对路径(基于您所处的位置)。如果你愿意,你可以导航到空文件夹(t2)并这样做:

sudo cp -R t1/* ./

或者你可以导航到files (t1)文件夹,这样做:

sudo cp -R ./* t2/

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

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

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

注意folder1后面的点(.)表示folder1内的所有内容

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

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.

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

$ cp -r -T t1 t2