Linux 如何让cp命令创建将文件复制到目标所需的文件夹

Linux 如何让cp命令创建将文件复制到目标所需的文件夹,linux,bash,cp,Linux,Bash,Cp,使用cp将文件复制到可能存在或可能不存在的文件夹时,如果需要,如何获取cp以创建文件夹?以下是我尝试过的: 我不知道你能用cp做到这一点 你可以用mkdir来做 mkdir -p /var/path/to/your/dir 编辑 有关合并cp的信息,请参见LHUNTAH。没有此类选项。您可以做的是在复制文件之前运行mkdir-p 我制作了一个非常酷的脚本,你可以用它在不存在的地方复制文件 #!/bin/bash if [ ! -d "$2" ]; then mkdir -p "$2"

使用
cp
将文件复制到可能存在或可能不存在的文件夹时,如果需要,如何获取
cp
以创建文件夹?以下是我尝试过的:


我不知道你能用cp做到这一点

你可以用mkdir来做

mkdir -p /var/path/to/your/dir
编辑
有关合并cp的信息,请参见LHUNTAH。

没有此类选项。您可以做的是在复制文件之前运行mkdir-p

我制作了一个非常酷的脚本,你可以用它在不存在的地方复制文件

#!/bin/bash
if [ ! -d "$2" ]; then
    mkdir -p "$2"
fi
cp -R "$1" "$2"
现在只需保存它,授予它权限并使用

./cp-improved SOURCE DEST

我把-R选项,但它只是一个草案,我知道它可以,你会改善它在许多方面。希望它能帮助您

也可以使用命令
查找

find ./ -depth -print | cpio -pvd newdirpathname

要扩展Christian的答案,唯一可靠的方法是将
mkdir
cp
结合起来:

mkdir -p /foo/bar && cp myfile "$_"
另一方面,当您只需要在现有层次结构中创建一个目录时,
rsync
可以在一个操作中完成。我非常喜欢
rsync
作为一种更通用的
cp
替代品,事实上:

rsync -a myfile /foo/bar/ # works if /foo exists but /foo/bar doesn't.  bar is created.
若路径中有一个源文件,它将不会在目标中创建任何现有路径。 这不会创建空目录

刚才我看到xxxxxxxx:没有这样的文件或目录,因为我的可用空间不足。没有错误消息

同上:

ditto -V /source/path/* /destination/path
ditto: /destination/path/any.zip: No space left on device
一旦释放空间
cp-Rvn/source/path/*/destination/path/
按预期工作

rsync正常工作

#file:
rsync -aqz _vimrc ~/.vimrc

#directory:
rsync -aqz _vim/ ~/.vim

请引用您的参数展开式。否则,您将遭受单词拆分和路径名扩展带来的错误。在你所有的$foo周围放上“”,如果有人在处理时试图重命名该文件,会导致奇怪的结果:
cp-improved/foo/file.jpg/bar/file.jpg.bak
。我将以
/bar/file.jpg.bak/file.jpg
结束,不管
bar
是否存在。mkdir-p/foo/bar&&cp myfile“$\”确实是可靠执行此操作的唯一方法。请检查此答案-此答案不应在这里。问题是关于
cp
而不是
mkdir
…嗨@KarlMorrison这是一个8岁的问题和答案。我还说,这是为mkdir而不是cp。我知道,这是2017年,这是问题的直接答案,不应该是。我知道你说过,但是像我这样的人实际上在寻找关于
cp
命令的答案时遇到了这样的答案,这与
cp
延长我对正确答案的搜索无关。这里唯一准确的答案是他说,
cp
做不到这一点。没有其他人(包括你自己)说使用
cp
是不可能的。上面的回答中提到了这一点,但我想再次强调一下(因为没有注意到细节而浪费了几分钟):上面的
rsync
命令与上面的
mkdir/cp
命令并不等价。它只创建一个单一级别的文件夹。事实上,我不确定它什么时候有用。这个答案是最好的,因为如果你在谷歌搜索之前键入了之前的cp命令,那么你可以轻松地
ctrl+a
找到你考虑不周的
cp
命令的开头并纠正它。非常感谢。此外,对于任何想知道
mkdir
-p
参数的人来说,它在POSIX标准at中有文档记录,并导致创建中间路径名组件(即允许您
mkdir foo/bar/baz
,即使
foo
bar
还不存在)。
“$”
是一个
bash变量
-。@pengheng:是的,这个rsync命令只能创建一个级别的文件夹,但是rsync可以选择创建全部或部分文件夹@内拉尔:问题的年龄是次要问题;答案的质量和广度应该是决定因素。我对这两种方式都没有强烈的偏好,但我认为在这一点上扭转这种重复的关系是不值得的。如果您不这么认为,请提供一个理由(可能是正确的可视性和流程)。查找相同的内容,但在下面找不到我的答案,因此将在阅读路径时发布我是如何完成此操作的:
dirname”/nosuchdirectory/hi.txt“|;do mkdir-p“$path”;完成(&cp-f URL resume/nosuchdirectory/hi.txt
请参阅,例如,不起作用。。rsync将只为您创建一个目录。
ditto -V /source/path/* /destination/path
ditto: /destination/path/any.zip: No space left on device
#file:
rsync -aqz _vimrc ~/.vimrc

#directory:
rsync -aqz _vim/ ~/.vim
 mkdir -p `dirname /nosuchdirectory/hi.txt` && cp -r urls-resume /nosuchdirectory/hi.txt