在 bash 中我需要这样做:
将所有文件放在一个目录中
将它们复制到现有目录中
我该怎么做?我尝试了
cp -r t1 t2
(t1 和t2 都是现有目录,t1 中有文件)但是它在t2 中创建了一个名为t1 的目录,我不想要那个,我需要t1 中的文件直接进入t2 中。我该怎么做?
你想要的是:
cp -R t1/. t2/
末尾的点告诉它复制当前目录的内容,而不是目录本身。此方法还包括隐藏文件和文件夹。
cp dir1/* dir2
或者如果您在 dir1 中有您想要复制的目录
cp -r dir1/* dir2
如果你想从一个目录复制一些东西到 current 目录,这样做:
cp dir1/* .
假设您没有尝试复制隐藏文件。
假设t1是里面有文件的文件夹,t2是空目录。你想要的是这样的:
sudo cp -R t1/* t2/
请记住,对于第一个示例,t1 和 t2 必须是完整路径或相对路径(基于您所在的位置)。如果需要,您可以导航到空文件夹 (t2) 并执行此操作:
sudo cp -R t1/* ./
或者您可以导航到包含文件 (t1) 的文件夹并执行此操作:
sudo cp -R ./* t2/
注意:*号(或通配符)代表所有文件和文件夹。 -R 标志表示递归(所有内容中的所有内容)。
cp -R t1/ t2
源目录上的尾部斜线稍微改变了语义,所以它复制了内容而不是目录本身。它还避免了 Bertrand 的答案中存在的通配符和不可见文件的问题(复制
t1/*
遗漏不可见文件,复制 `t1/* t1/.*' 复制 t1/. 和 t1/..,这是你不想要的) .
对于某些目录内部,这将使用 full,因为它将所有内容从“folder1”复制到某些目录中的新目录“folder2”。
$(pwd) 将获取当前目录的路径。
注意 folder1 之后的点 (.) 以获取 folder1 中的所有内容
cp -r $(pwd)/folder1/. $(pwd)/folder2
带有Flag“-R”的代码完美复制“folder1”的所有内容到现有“folder2”:
cp -R folder1/. folder2
标志“-R”也复制符号链接但是标志“-r”跳过符号链接所以标志“-R”比标志“-r”更好。
-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.
根据一些细节你可能需要做这样的事情:
r=$(pwd)
case "$TARG" in
/*) p=$r;;
*) p="";;
esac
cd "$SRC" && cp -r . "$p/$TARG"
cd "$r"
...这基本上更改为 SRC 目录并将其复制到目标,然后返回到您开始的地方。
额外的麻烦是处理相对或绝对目标。
(这不依赖于
cp
命令本身的微妙语义......关于它如何处理带或不带尾随 / 的源规范......因为我不确定它们是否稳定,便携和可靠只是 GNU cp
,我不知道他们将来是否会继续如此)。
正确的选项应该是
-T
。与-r
一起使用递归复制。
$ cp -r -T t1 t2
就我而言,在 ubuntu 20.04.6 上,bash 不接受我的双引号命令。例如
cp "$HOME/.local/lib/*" ./lib/
返回=>
$>cp: cannot stat '/home/user1/.local/lib/*': No such file or directory
该目录存在于我的系统中,因此它可能是按字面意思解释星号。通过删除引号,它起作用了。 这里是关于bash引用变量解释的参考页